OneToOneモデル内部の保存のForeignKey私がそれらを作っDRFを使用してDjangoの残りのフレームワーク:第2回モデルにFKをである私がOneToOneに関連しており、モデル2つの機種を持っている
models.py
class Legal(TimeStampedModel):
name = models.CharField('Name', max_length=255, blank=True)
class LegalCard(TimeStampedModel):
legal = models.OneToOneField('Legal', related_name='legal_card', on_delete=models.CASCADE)
branch = models.ForeignKey('Branch', related_name='branch', null=True)
post_address = models.CharField('Post address', max_length=255, blank=True)
class Branch(TimeStampedModel):
name = models.CharField('Name',max_length=511)
code = models.CharField('Code', max_length=6)
私は両方を作成または更新することができますので、単一のモデルとして振る舞う:
serializer.py
class LegalSerializer(serializers.ModelSerializer):
branch = serializers.IntegerField(source='legal_card.branch', allow_null=True, required=False)
post_address = serializers.CharField(source='legal_card.post_address', allow_blank=True, required=False)
class Meta:
model = Legal
fields = ('id',
'name',
'branch',
'post_address',
)
depth = 2
def create(self, validated_data):
legal_card_data = validated_data.pop('legal_card', None)
legal = super(LegalSerializer, self).create(validated_data)
self.update_or_create_legal_card(legal, legal_card_data)
return legal
def update(self, instance, validated_data):
legal_card_data = validated_data.pop('legal_card', None)
self.update_or_create_legal_card(instance, legal_card_data)
return super(LegalSerializer, self).update(instance, validated_data)
def update_or_create_legal_card(self, legal, legal_card_data):
LegalCard.objects.update_or_create(legal=legal, defaults=legal_card_data)
views.py
class LegalDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Legal.objects.all()
serializer_class = LegalSerializer
私は(私はブランチのIDを投稿したい)整数としてFKを送信することにより、これを保存しようとしているが、私はエラー
ValueError: Cannot assign "2": "LegalCard.branch" must be a "Branch" instance.
を受け取ります
ブランチのIDだけを渡す方法はありますか?
は、あなただけのFK値が必要な場合、あなたはあなたではなく、関連するオブジェクトを取得よりも、持っているオブジェクトに既にあるFK値を使用することができ、ジャンゴであなたに
ありがとう、私はちょうどブランチの代わりに 'legal_card.branch_id'を使用するために私のシリアライザで言う必要があります –