繁体   English   中英

Django:如何通过过滤器查询集从 ForeignKey model 返回字段。 因为它不会抛出 JSON 可序列化

[英]Django: How to return a field from a ForeignKey model through filter queryset. As it throws not JSON Serializable

我想从Contet model 返回一个字段,它是Saved model 的 ForeignKey 字段。 我正在使用filter查询集,因为它返回多个值。 但是,问题是我无法在Saved.objects.filter(user=self.request.user)之后使用content.slugContent model 返回slug字段!

内容 model:

class Content(models.Model):
    title = models.CharField(max_length=200, blank=False)
    slug = models.CharField(max_length=200, blank=False)
    ...

我保存的 model:

class Saved(models.Model):
    content = models.ForeignKey('Content', on_delete=models.SET_NULL)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    ...

我的观点:

class SavedList(viewsets.ModelViewset):
    serializer_class = SavedSerializer
    permission_classes = [permissions.IsAuthenticated]
    
    def get_queryset(self):
        return Saved.objects.filter(user=self.request.user)

    def list(self, request):
        savedList = []
        for i in self.get_queryset():
            dict = {
                'slug': i.content.slug,  # i want this
                'content': i.content,
                'user': i.user
            }
            savedList.append(dict)
        return Response(savedList)

当我运行它时,它返回Object of type 'Content' is not JSON Serializable

如何从Content model 中获取slug

该错误是因为您的def list()中的i是 class Content的 object 。

您可以通过创建嵌套序列化程序来实现它,如下所示。 可能您不需要def list()方法。

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = settings.AUTH_USER_MODEL
        fields = '__all__' # provide the list fields from `settings.AUTH_USER_MODEL` to include in nested object.

class ContentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Content
        fields = '__all__' # provide the list fields from `Content ` to include in nested object.

class SavedSerializer(serializers.ModelSerializer):
    
    content = ContentSerializer(many=True) # this will create a nested object.
    user = UserSerializer(many=True) # this will create a nested object.

    class Meta:
        model = Saved
        fields = ['content', 'user'] # you can add more fields of `Saved` model.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM