Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django rest框架通过OneToOneField查找\u字段_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

Python django rest框架通过OneToOneField查找\u字段

Python django rest框架通过OneToOneField查找\u字段,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,期望的行为 用户查找通过用户名进行:/api/users/randall 扬声器查找也通过用户名进行:/api/speakers/randall 约束 并非所有用户都是演讲者。所有扬声器都是用户 型号.py from django.contrib.auth.models import User class Speaker(models.Model): user = models.OneToOneField(User) class UserSerializer(serializers.

期望的行为
用户查找通过用户名进行:
/api/users/randall

扬声器查找也通过用户名进行:
/api/speakers/randall

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

型号.py

from django.contrib.auth.models import User

class Speaker(models.Model):
    user = models.OneToOneField(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
        lookup_field = '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"
序列化程序.py

from django.contrib.auth.models import User

class Speaker(models.Model):
    user = models.OneToOneField(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
        lookup_field = '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"
视图.py

from django.contrib.auth.models import User

class Speaker(models.Model):
    user = models.OneToOneField(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
        lookup_field = '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"
我尝试了各种不同的lookup_字段和序列化器类型调用,但都没有成功。如果没有更多的代码,这可能是不可能的。我只是想知道我能走什么方向


谢谢

您尝试过这种方法吗

class SpeakerViewSet(viewsets.ModelViewSet):
    queryset = Speaker.objects.all().select_related('user')
    serializer_class = SpeakerSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('user', 'user__username',)

我就是这样设法破解的

models.py 序列化程序.py view.py
您是否尝试过在
lookup\u字段中使用双下划线来查看这是否可行?它类似于queryset过滤器。我尝试过使用
lookup\u field=“user\uu username”
,但它不起作用。我曾尝试在模型和视图上使用该选项,但均无效:(
'Speaker'对象没有属性'user\u username'
@ranman你想要什么?你想序列化一个相关对象吗?我想能够通过与演讲者相关联的用户的用户名来查找演讲者对象
'Speaker'对象没有属性'user\u username'
似乎不起作用。我可能有即时消息打错了。实际上它不起作用——出于某种原因,这不允许两件事:当你创建一个新的演讲者时,用户字段不能再被写入,演讲者不能再呈现在与它有关系的项目上。我怎样才能重现你的错误?我的意思是我试图通过python创建一个新的
演讲者
shell,它会顺利通过,如果您试图通过
api
创建
扬声器
,那么
用户
字段被标记为
只读
,这就是它不起作用的原因。我还创建了一个虚拟模型,将
OneToOneField
添加到
扬声器
,这也适用于
ModelSerializere> 而
HyperlinkedModelSerializer
对于第二个字段,我只需要用as
HyperlinkedRelatedField
lookup\u field='user\uu username'
重新定义
SpeakerSerializer
字段的
SpeakerSerializer
字段。