python - django rest framework lookup_field 通过 OneToOneField

标签 python django rest django-rest-framework

https://gist.github.com/ranman/3d97ea9054c984bca75e

期望的行为
用户查找通过用户名进行:/api/users/randall
扬声器查找也通过用户名进行:/api/speakers/randall

约束
并非所有用户都是演讲者。所有演讲者都是用户。

模型.py

from django.contrib.auth.models import User

class Speaker(models.Model):
    user = models.OneToOneField(User)

序列化器.py

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')
        lookup_field = 'username'
 
class SpeakerSerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.HyperlinkedRelatedField(
        view_name='user-detail',
        read_only=True,
        lookup_field='username'
    )
    class Meta:
        model = Speaker
        lookup_field = 'user'

views.py

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    lookup_field = 'username'
    
class SpeakerViewSet(viewsets.ModelViewSet):
    queryset = Speaker.objects.all().select_related('user')
    serializer_class = SpeakerSerializer
    lookup_field = "user"

我已经尝试了 lookup_field 和序列化程序类型的各种不同调用,但都无济于事。如果没有更多的代码,这可能是不可能的。我只是想知道我可以采取什么方向。

最佳答案

我就是这样破解的

模型.py

from django.db import models    
from django.contrib.auth.models import User

class Speaker(models.Model):
    user = models.OneToOneField(User)

    @property
    def user__username(self):
        return self.user.username
    
    def __unicode__(self):
        return self.user.username

序列化器.py

from .models import Speaker
from rest_framework import serializers
from django.contrib.auth.models import User

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')
        lookup_field = 'username'

class SpeakerSerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.HyperlinkedRelatedField(
        view_name='user-detail',
        read_only=True,
        lookup_field='username'
    )
    class Meta:
        model = Speaker
        fields = ('url', 'user')
        lookup_field = 'user__username'

View .py

from .models import Speaker
from .serializers import SpeakerSerializer, UserSerializer

from rest_framework import viewsets
from django.contrib.auth.models import User

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    lookup_field = 'username'

class SpeakerViewSet(viewsets.ModelViewSet):
    queryset = Speaker.objects.all().select_related('user')
    serializer_class = SpeakerSerializer
    lookup_field = 'user__username'

关于python - django rest framework lookup_field 通过 OneToOneField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068097/

相关文章:

rest - 获取 415 - Postman post 方法中不支持的媒体类型

python - 使用python在teensy bord和系统之间进行串行通信

在列表理解中使用第二个条件的 Pythonic 方式

django - 如何删除 Django 模型中的 ImageField 图像

rest - 如何将swagger-ui与部署在运行在eclipse上的tomcat中的服务一起使用

java - 使用传出 HTTP 请求测试 void 方法

python - 从列表 Python 中向字典添加键

python - 糟糕的 Django 管理性能

Django 测试客户端发布数据为空

python - Django 更新密码使last_name 为空