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)
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.
| 归档时间: |
|
| 查看次数: |
13649 次 |
| 最近记录: |