【问题标题】:DRF: Let serializer filter related objectsDRF:让序列化器过滤相关对象
【发布时间】:2017-09-11 13:44:58
【问题描述】:

我有下面列出的三个模型。当我序列化媒体对象时,所有者会按应有的方式列出。槽表拥有is_accepted 值,我希望媒体序列化程序仅列出拥有媒体的所有者。关于如何实现这一点的任何想法?

型号:

class Media(models.Model):
    genre = models.ForeignKey(Genre, blank=True, null=True, db_index=True)
    owners = models.ManyToManyField(User, through='Usermedia', related_name='owners')
    title = models.CharField(max_length=45, blank=True)
    created = models.DateTimeField(auto_now_add=True)

class Usermedia(models.Model):
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING, related_name='usermedia')
    media = models.ForeignKey(Media, on_delete=models.CASCADE, related_name='ownership')
    is_active = models.BooleanField(default=0)
    is_accepted = models.BooleanField(default=1)

class User(AbstractBaseUser, PermissionsMixin):
    email=models.CharField(unique=True, max_length=255)

序列化器

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(
        validators=[validators.UniqueValidator(queryset=User.objects.all())]
    )

class MediaSerializer(serializers.ModelSerializer):
    owners = UserSerializer(many=True, required=False)
    created = serializers.DateTimeField(read_only=True)
    genre = serializers.SlugRelatedField(required=True, slug_field='name', queryset=Genre.objects.all())

感谢您抽出宝贵时间查看此内容

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我最终使用了SerializerMethodField

    我的序列化器现在看起来像这样:

    class MediaSerializer(serializers.ModelSerializer):
        owners = SerializerMethodField()
        created = serializers.DateTimeField(read_only=True)
        genre = serializers.SlugRelatedField(required=True, slug_field='name', queryset=Genre.objects.all())
    
        def get_owners(self, obj):
            ownerships = obj.ownership.all()
            owners = [ownership.user for ownership in ownerships if (ownership.is_active and ownership.is_accepted)]
    
            return UserSerializer(owners, many=True).data
    

    一个提示是确保在将结果传递给序列化程序之前预取相关字段,否则序列化程序将针对它解析的每个实例对数据库进行查找。

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多