簡體   English   中英

在DRF序列化器中處理ManyToMany字段

[英]Handling ManyToMany field in DRF serializer

我有以下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請求創建Article的同時添加現有標簽的列表,即

{ '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屬於現有的標記實例。 因此,我嘗試將以下方法添加到序列化器中。

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

由於某種原因,未觸發此驗證方法。 我正在嘗試找出正確的方法來為文章添加標簽,任何建議將不勝感激。

由於您是從序列化器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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM