django rest框架更改主键使用unqiue字段

Mo *_*abi 15 django django-rest-framework

我有一个被称为模型的模型GameProfile,它与User模型是一对一的关系.我用过HyperlinkedModelSerializer我所有的设计.

对于GameProfile,用户字段被认为是查询的主键,它是唯一的但我没有将其设置为主键.有没有办法将django serializer的默认行为更改为指向user__id主键,并始终使用它来在详细信息视图中检索配置文件?

class GameProfileSerializer(serializers.HyperlinkedModelSerializer):
    """ 
    """
    user_pk = serializers.Field(source='user.id')

    class Meta:
        model = GameProfile


class GameProfileViewSet(viewsets.ModelViewSet):
    """
    """
    queryset = GameProfile.objects.all()
    serializer_class = GameProfileSerializer

    def get_queryset(self):
        """ get_queryset
        """
        queryset = super(GameProfileViewSet, self).get_queryset()
        if not queryset.exists():
            raise Http404
        if self.request.user.is_authenticated() and not self.request.user.is_superuser:
            return queryset.filter(user=self.request.user)
        return queryset
Run Code Online (Sandbox Code Playgroud)

请指教,提前谢谢:)

alm*_*lki 18

假设您的GameProfile模型如下:

class GameProfile(models.Model)
    user = models.OneToOneField('User')
Run Code Online (Sandbox Code Playgroud)

序列化器将是:

class GameProfileSerializer(serializers.HyperlinkedModelSerializer):
    user_id = serializers.Field(source='user.id')

    class Meta:
        model = GameProfile
Run Code Online (Sandbox Code Playgroud)

.lookup_field在视图上正确设置属性:

    lookup_field = 'user_id'
Run Code Online (Sandbox Code Playgroud)

网址将是:

/gameprofile/<user_id>
Run Code Online (Sandbox Code Playgroud)

  • 除非您需要2个字段来保证唯一的查找结果,否则您将如何执行此操作?(例如user_region和user_id,b/c用户ID只对每个区域唯一?) (3认同)

Avr*_*ril 14

为了使URL工作,您可能需要lookup_field在ViewSet 上添加,而不仅仅是在序列化程序上.所以你会:

class GameProfileViewSet(viewsets.ModelViewSet):
    queryset = GameProfile.objects.all()
    serializer_class = GameProfileSerializer
    lookup_field = 'user__id'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,lookup_field使用双下划线表示法而不是点表示法(点在URL模式中的正则表达式中不起作用).我无法得到@almalki@patsweet提出的解决方案来工作; 根据序列化程序的文档,"此选项[ lookup_field] 的值应与URL conf中的kwarg以及模型上的字段对应",因此它可能不适用于RelatedFields.