如何在DjandoREST框架中设置嵌套的相关字段序列化程序?

r55awzrz  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(358)

我正在使用django rest框架构建一个api,在该api中,我拥有以下用户制作、确认和显示对事件感兴趣的模型:
models.py

  1. class User(AbstractBaseUser, PermissionsMixin):
  2. user_name = models.CharField(_("user name"), max_length=150, unique=True)
  3. slug = AutoSlugField(populate_from='user_name', unique=True)
  4. class Event(models.Model):
  5. name = models.CharField(max_length=100, blank=False, null=False)
  6. owner = models.ForeignKey(User, related_name="owned_events", on_delete=models.SET_NULL, blank=True, null=True)
  7. confirmed = models.ManyToManyField(User, related_name="confirmed_events", blank=True)
  8. interested = models.ManyToManyField(User, related_name="interested_events", blank=True)

为了序列化它,我使用了我在这里和drf文档中找到的以下代码:
序列化程序.py

  1. class UserSerializer(serializers.HyperlinkedModelSerializer):
  2. class Meta:
  3. model = User
  4. fields = [
  5. "url",
  6. "user_name",
  7. "password",
  8. ]
  9. extra_kwargs = { "password": {"write_only": True} }
  10. class EventSerializer(serializers.HyperlinkedModelSerializer):
  11. owner = UserSerializer(required=False)
  12. confirmed = UserSerializer(required=False, many=True)
  13. interested = UserSerializer(required=False, many=True)
  14. class Meta:
  15. model = Event
  16. lookup_field = 'slug'
  17. extra_kwargs = { 'url': {'lookup_field': 'slug'} }
  18. fields = [
  19. "url",
  20. "owner",
  21. "name",
  22. "confirmed",
  23. "interested",
  24. ]

它可以像那样工作,但是我希望userserializer显示每个用户的已确认和感兴趣的事件,就像每个事件显示已确认和感兴趣的用户一样。我更改了序列化程序并获得了每个事件的url,如下所示:
userserializer上带有hyperlinkedrelatedfield的serializers.py

  1. class UserSerializer(serializers.HyperlinkedModelSerializer):
  2. confirmed_events = serializers.HyperlinkedRelatedField(
  3. queryset=Event.objects.all(),
  4. view_name='event-detail',
  5. lookup_field='slug',
  6. many=True,
  7. required=False
  8. )
  9. interested_events = serializers.HyperlinkedRelatedField(
  10. queryset=Event.objects.all(),
  11. view_name='event-detail',
  12. lookup_field='slug',
  13. many=True,
  14. required=False
  15. )
  16. class Meta:
  17. model = User
  18. fields = [
  19. "url",
  20. "user_name",
  21. "password",
  22. "confirmed_events",
  23. "interested_events",
  24. ]
  25. extra_kwargs = { "password": {"write_only": True} }

这从用户模型中获得了以下json:

  1. {
  2. "user_name": "d",
  3. "confirmed_events": [],
  4. "interested_events": [
  5. "http://localhost:8000/events/eqwer-2/",
  6. "http://localhost:8000/events/test/",
  7. "http://localhost:8000/events/test-2/",
  8. "http://localhost:8000/events/test-3/",
  9. ]
  10. }

从事件模型中:

  1. {
  2. "url": "http://localhost:8000/events/eqwer-2/",
  3. "owner": null,
  4. "name": "eqwer",
  5. "slug": "eqwer-2",
  6. "confirmed": [],
  7. "interested": [
  8. {
  9. "user_name": "d",
  10. "confirmed_events": [],
  11. "interested_events": [
  12. "http://localhost:8000/events/eqwer-2/",
  13. "http://localhost:8000/events/test/",
  14. "http://localhost:8000/events/test-2/",
  15. "http://localhost:8000/events/test-3/",
  16. ]
  17. }
  18. ]
  19. },

事件模型json很好,因为它显示每个用户的数据,但我希望用户json显示每个事件数据,而不仅仅是事件url,它类似于:

  1. {
  2. "user_name": "d",
  3. "confirmed_events": [],
  4. "interested_events": [
  5. {
  6. "url": "http://localhost:8000/events/eqwer-2/",
  7. "owner": null,
  8. "name": "eqwer",
  9. "slug": "eqwer-2",
  10. },
  11. ]
  12. }
z2acfund

z2acfund1#

为创建单独的序列化程序 interested_events 像这样:

  1. class InterestedEventsSerializer(serializers.HyperlinkedModelSerializer):
  2. class Meta:
  3. fields = ('url', 'owner', 'name', 'slug')

在你的 UserSerializer 申报 interested_events 使用上面的序列化程序:

  1. class UserSerializer(serializers.HyperlinkedModelSerializer):
  2. confirmed_events = ... #
  3. interested_events = InterestedEventsSerializer(many=True)
  4. class Meta:
  5. model = User
  6. fields = [
  7. "url",
  8. "user_name",
  9. "password",
  10. "confirmed_events",
  11. "interested_events",
  12. ]
  13. extra_kwargs = { "password": {"write_only": True} }
展开查看全部

相关问题