[英]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.