python - 如何在 Djando Rest Framework 中设置嵌套的相关字段序列化器?
问题描述
我正在使用 Django Rest Framework 构建一个 API,在该 API 中,我有以下用户模型来制作、确认和显示对事件的兴趣:
模型.py
class User(AbstractBaseUser, PermissionsMixin):
user_name = models.CharField(_("user name"), max_length=150, unique=True)
slug = AutoSlugField(populate_from='user_name', unique=True)
class Event(models.Model):
name = models.CharField(max_length=100, blank=False, null=False)
owner = models.ForeignKey(User, related_name="owned_events", on_delete=models.SET_NULL, blank=True, null=True)
confirmed = models.ManyToManyField(User, related_name="confirmed_events", blank=True)
interested = models.ManyToManyField(User, related_name="interested_events", blank=True)
为了序列化它,我使用了我在此处和 DRF 文档中找到的以下代码:
序列化程序.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = [
"url",
"user_name",
"password",
]
extra_kwargs = { "password": {"write_only": True} }
class EventSerializer(serializers.HyperlinkedModelSerializer):
owner = UserSerializer(required=False)
confirmed = UserSerializer(required=False, many=True)
interested = UserSerializer(required=False, many=True)
class Meta:
model = Event
lookup_field = 'slug'
extra_kwargs = { 'url': {'lookup_field': 'slug'} }
fields = [
"url",
"owner",
"name",
"confirmed",
"interested",
]
它就像那样工作得很好,但我希望 UserSerializer 显示每个用户的确认和感兴趣的事件,就像每个事件显示用户确认和感兴趣一样。我更改了序列化程序并获得了每个事件的 url,如下所示:
在 UserSerializer 上带有 HyperlinkedRelatedField 的serializers.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
confirmed_events = serializers.HyperlinkedRelatedField(
queryset=Event.objects.all(),
view_name='event-detail',
lookup_field='slug',
many=True,
required=False
)
interested_events = serializers.HyperlinkedRelatedField(
queryset=Event.objects.all(),
view_name='event-detail',
lookup_field='slug',
many=True,
required=False
)
class Meta:
model = User
fields = [
"url",
"user_name",
"password",
"confirmed_events",
"interested_events",
]
extra_kwargs = { "password": {"write_only": True} }
这让我从 User 模型中得到了以下 JSON:
{
"user_name": "d",
"confirmed_events": [],
"interested_events": [
"http://localhost:8000/events/eqwer-2/",
"http://localhost:8000/events/test/",
"http://localhost:8000/events/test-2/",
"http://localhost:8000/events/test-3/",
]
}
从事件模型:
{
"url": "http://localhost:8000/events/eqwer-2/",
"owner": null,
"name": "eqwer",
"slug": "eqwer-2",
"confirmed": [],
"interested": [
{
"user_name": "d",
"confirmed_events": [],
"interested_events": [
"http://localhost:8000/events/eqwer-2/",
"http://localhost:8000/events/test/",
"http://localhost:8000/events/test-2/",
"http://localhost:8000/events/test-3/",
]
}
]
},
事件模型 JSON 很好,因为它显示了每个用户的数据,但我希望用户 JSON 显示每个事件数据而不仅仅是事件 URL,它类似于:
{
"user_name": "d",
"confirmed_events": [],
"interested_events": [
{
"url": "http://localhost:8000/events/eqwer-2/",
"owner": null,
"name": "eqwer",
"slug": "eqwer-2",
},
]
}
解决方案
像这样创建一个单独的序列化程序interested_events
:
class InterestedEventsSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
fields = ('url', 'owner', 'name', 'slug')
并在您UserSerializer
声明interested_events
使用上面的序列化程序:
class UserSerializer(serializers.HyperlinkedModelSerializer):
confirmed_events = ... #
interested_events = InterestedEventsSerializer(many=True)
class Meta:
model = User
fields = [
"url",
"user_name",
"password",
"confirmed_events",
"interested_events",
]
extra_kwargs = { "password": {"write_only": True} }
推荐阅读
- javascript - 如何在导航栏中右对齐文本 - HTML
- android - “预览”屏幕中的Android空白屏幕
- c++ - c++如何评估赋值运算符(if语句)
- python - 带有日期时间索引的 Pandas Pivot
- javascript - 如何在Javascript中过滤对象数组
- javascript - 通过右键单击、Applescript 和/或 Javascript 访问浏览器中的链接?
- jquery - 如何设置 jquery addClass/removeClass
- java - 在 RxJava 2.x 中使用 flatMap
- php - 在 docker 上运行的 PHP 5.6 无法设置 memcached.serializer="igbinary"
- r - dplyr / left_join 中的嵌套管道链