gpt4 book ai didi

django - 在 django-rest-framework 中序列化通用关系

转载 作者:行者123 更新时间:2023-12-04 19:39:27 25 4
gpt4 key购买 nike

我正在尝试学习如何在 Django-Rest-Framework 中使用 GenericRelations。我找到了 serializer relations 的文档页面并遵循代码。
我创建了模型:

class TaggedItem(models.Model):
"""
Tags arbitary model instance using a generic relation.

"""
tag_name = models.SlugField()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
tagged_object = GenericForeignKey('content_type', 'object_id')

def __unicode__(self):
return self.tag_name

class Bookmark(models.Model):
"""
A bookmark consists of a URL, and 0 or more descriptive tags.
"""
link_url = models.URLField()
tags = GenericRelation(TaggedItem)

class Note(models.Model):
"""
A note consists of some texts, and 0 or more descriptive tags
"""
text = models.CharField(max_length=1000)
tags = GenericRelation(TaggedItem)

我创建了序列化程序:
class BookmarkSerializer(serializers.ModelSerializer):
class Meta:
model = Bookmark
fields = ('url', 'link_url', )


class NoteSerializer(serializers.ModelSerializer):
class Meta:
model = Note
fields = ('url', 'text', )


class TaggedObjectRelatedField(serializers.RelatedField):
"""
A custom field to use for the 'tagged_object' generic relationship
"""

def to_representation(self, value):
"""
Serialize tagged objects to their respective serializer formats
:param value:
:return:
serializer.data
"""
if isinstance(value, Bookmark):
return 'Bookmark: ' + value.url
elif isinstance(value, Note):
return 'Note: ' + value.text
raise Exception('Unexpected type of tagged object')


class TaggedItemSerializer(serializers.ModelSerializer):
tagged_object = TaggedObjectRelatedField()
class Meta:
model = TaggedItem
fields = ('url', 'id', 'tag_name', 'tagged_object')

现在应该是 的输入TaggedObjectRelatedField() TaggedItemSerializer ?
目前我收到错误
  File "/home/aswin/Documents/WebProjects/drf_practice/uni_auth//loginpage/login/serializers.py", line 76, in TaggedItemSerializer
tagged_object = TaggedObjectRelatedField()
File "/home/aswin/Documents/WebProjects/drf_practice/uni_auth/lib/python3.5/site-packages/rest_framework/relations.py", line 80, in __init__
'Relational field must provide a `queryset` argument, '
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.

我尝试将参数设为 只读=真也是,但它抛出了同样的错误。只是为了说明我所做的:
class TaggedItemSerializer(serializers.ModelSerializer):
tagged_object = TaggedObjectRelatedField(read_only=True)

请在这件事上给予我帮助

最佳答案

我在您提到的有关序列化 TaggedItem 的文章中没有看到任何内容,您为什么要序列化 ​​TaggedItem?

这是我的序列化程序类:

from models import Bookmark, Note, TaggedItem
from rest_framework import serializers


class TaggedObjectRelatedField(serializers.RelatedField):
def to_representation(self, value):
if isinstance(value, Bookmark):
serializer = BookMarkSerializer(value)
elif isinstance(value, Note):
serializer = NoteSerializer(value)
else:
raise Exception('Unexpected type of tagged object')

return serializer.data


class BookMarkSerializer(serializers.HyperlinkedModelSerializer):
tags = TaggedObjectRelatedField(many=True, queryset=TaggedItem.objects.all())

class Meta:
model = Bookmark
fields = ('pk', 'url', 'tags')


class NoteSerializer(serializers.HyperlinkedModelSerializer):
tags = TaggedObjectRelatedField(many=True, queryset=TaggedItem.objects.all())

class Meta:
model = Note
fields = ('pk', 'text', 'tags')

关于django - 在 django-rest-framework 中序列化通用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38721923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com