2017-11-21 9 views
0

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値を使用することができ、ジャンゴであなたに

答えて

1

ありがとうございます。ただ単にID、ない関連オブジェクトを取得する代わりにlegal_card.branchのlegal_card.branch_id使用

LegalCard(legal_id=1,branch_id=1,post_address="Istanbul Street No:1") 
+0

ありがとう、私はちょうどブランチの代わりに 'legal_card.branch_id'を使用するために私のシリアライザで言う必要があります –

0

: あなたは、あなたがでLegalCardオブジェクトを保存することができます。1.としてのidの法的および支店のオブジェクトを持っていると仮定します。 深さ= 1

+0

ありがとう、上記と同じ解決策は私の問題を解決しました –

関連する問題