【问题标题】:Reverse Relationships in Django-Rest frameworkDjango-Rest 框架中的反向关系
【发布时间】:2016-09-12 09:03:43
【问题描述】:

我有两个模型。现在 Class Track Model 有一个 Album 外键。 我想写一个具有专辑名称的音轨序列化器。我怎样才能做到这一点?

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks')
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title)

我将 Track 的 depth 参数设置为 1,但这会检索专辑名称以及艺术家。我只想要 Track Serializer 中的专辑名称

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    有很多解决方案。您可以使用多种类型的字段 e。 G。 StringRelatedField 或 SerializerMethodField。

    这是一个带有自定义相关字段的示例:

    from rest_framework import serializers
    
    
    class TrackField(serializers.RelatedField):
    
        def to_representation(self, value):
            return value.album_name
    
    
    class TrackSerializer(serializers.ModelSerializer):
    
        album = TrackField(queryset=Album.objects.all())
    
        class Meta:
            model = Track
            fields = ('album', 'order', 'title', 'duration')
    

    这会产生:

    track = Track.objects.get(...)
    
    TrackSerializer(track).data  # Returns {'album': <name of the album>, ...}
    

    【讨论】:

      【解决方案2】:
      class BaseSerializer(serializers.ModelSerializer):
          """
          A Base Serializer that takes an additional `fields` argument that
          controls which fields should be displayed.
          """
      
          def __init__(self, *args, **kwargs):
              # Don't pass the 'fields' arg up to the superclass
              fields = kwargs.pop('fields', None)
              exclude = kwargs.pop('exclude', None)
              # Instantiate the superclass normally
              super(BaseSerializer, self).__init__(*args, **kwargs)
      
              if fields:
                  # Drop any fields that are not specified in the `fields` argument.
                  allowed = set(fields)
                  existing = set(self.fields.keys())
                  for field_name in existing - allowed:
                      self.fields.pop(field_name)
              if exclude:
                  # Drop fields that are specified in the `exclude` argument.
                  excluded = set(exclude)
                  for field_name in excluded:
                      try:
                          self.fields.pop(field_name)
                      except KeyError:
                          pass
      

      我使用上面的类来明确排除我不想要的参数,

      信用:How to exclude parent when serializer is nested when using Django REST Framework?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-09
        • 2018-08-31
        • 1970-01-01
        • 2013-10-20
        • 2012-12-25
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        相关资源
        最近更新 更多