首页 文章

处理DRF序列化程序中的ManyToMany字段

提问于
浏览
0

我有以下Django模型:

class Article(models.Model):
  name = models.CharField(max_length=30, unique=True)
  tags = models.ManyToManyField(Tag)
  ...

class Tag(models.Model):
  name = models.CharField(max_length=30, unique=True)
  ...

我希望能够在通过POST请求创建文章时添加现有标签列表,即

{ 'name': 'My Org Name', 'tags': [1,2,3] }

其中[1,2,3]是标签ID列表 .

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

class ArticleSerializer(serializers.ModelSerializer):
     tags = serializers.PrimaryKeyRelatedField(many=True, read_only=True, allow_null=True)

     class Meta:
        model = Article
        fields = ('name', 'tags', ...)

     def create(self, validated_data):      
        # in create I will add tags, i.e. article.add(tag)    
        return Article.objects.create_article(**validated_data)

但后来我想进行一些验证,以便我知道传入的标记ID属于现有的Tag实例 . 所以我尝试将下面的方法添加到我的序列化程序中 .

def validate_tags(self, tags):
    if tags:
        for tag in tags:
            if not Tag.get(pk=tag):
                raise ValueError('Tag with id not found...')
    return tags

由于某些原因,不会触发此验证方法 . 我正在试图找出处理文章添加标签的正确方法,任何建议都将受到高度赞赏 .

1 回答

  • 1

    由于您从序列化器 ModelSerializer 扩展,因此您不需要验证它们,也无需验证它们 . DRF完成剩下的工作并根据Model关系创建字段和验证查询 .

    class ArticleSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Article
            fields = ('name', 'tags', ...)
    
        def create(self, validated_data):
            tags = validated_data.pop('tags')
            article = Article.objects.create(**validated_data)
            article.tags.add(*tags)
            return article
    

相关问题