0
デフォルト値を送信しようとしています。平易な英語でDRFにシリアライザを使用したデフォルト値の転記
が、これは私はそれが仕事をしたい方法です:
- データがない「タグ」フィールド(複数可)
- を持っていない場合は、タグ「なし」は所有者のために(存在しないかどうかを確認します「) タグ 『なし』が存在しない場合は、タグ「どれも場合
- は、M2M作成
- 、」が存在しません、 『所有者』)のために(タグなしを作成していないが
私のポストデータがするではなくには、投稿されているJSONデータにフィールドtag
が含まれています。
なしタグフィールドが存在しない場合には、このコードは何tag
フィールドが存在しない
除き完璧に動作し、それは私に指示「タグフィールドが必要とされる」
例データは
{title: "Testing"}
を掲載されています
Models.py
class Tag(models.Model):
name = models.CharField("Name", max_length=5000, blank=True)
taglevel = models.IntegerField("Tag level", null=True, blank=True)
owner = models.ForeignKey('auth.User', blank=True, null=True)v
class Item(models.Model):
title = models.CharField("Title", max_length=10000, blank=True)
tag = models.ManyToManyField('Tag', blank=True)
owner = models.ForeignKey('auth.User', blank=True, null=True)
シリアライザ
class ItemSerializer(serializers.ModelSerializer):
tag = TagSerializer(many=True, read_only=False)
info = InfoSerializer(many=True, read_only=True)
class Meta:
model = Item
ordering = ('-created',)
fields = ('title', 'pk', 'tag')
def create(self, validated_data):
tags_data = validated_data.pop('tag')
owner = self.context['request'].user
item = Item.objects.create(owner=owner, **validated_data)
for tag_data in tags_data:
tag_data['owner'] = owner
tag_qs = Tag.objects.filter(name__iexact=tag_data['name'])
if not tag_data:
Tag.objects.get_or_create(tag_name="None")
if tag_qs.exists():
tag = tag_qs.first()
else:
tag = Tag.objects.create(**tag_data)
item.tag.add(tag)
return item
:
あなたItemSerializerは今のように見えるはずです。それは "tag field required"エラーを停止しましたが、必要なデフォルトの "tag field"を設定しませんでした。別の提案をしてください。 – Ycon
@Ycon、 'default = None'の代わりにput' required = False'してください – doggra
運がいいです。代わりに 'require = False'を使用しましたが、それは私に重要なエラーを与えます。 'get_or_create'は実際に存在しない場合、" None "というタグを作成しますか?これはトレースバックです。http://dpaste.com/1BYMTDT – Ycon