2017-12-30 18 views
2

私のプロジェクトには2つのモデルがあります。モデルAとモデルBは、モデルAとの「OneToOne」関係を持っています。モデルBのシリアライザクラスを ".create()"関数で書きました。モデルBの保存に問題があります。 ()は、Slug値を挿入するためのBモデルの関数です。エラーは次のとおりです。django restframework _ OneToOneフィールドsave()

保存

()予期しないキーワード引数 'force_insert'

class A(models.Model): 
    address = models.Charfield(max_length=160) 

class b(models.Model): 
    a = models.OneToOneField(AdIfo, related_name='ad_info', primary_key=True, 
          on_delete=models.CASCADE) 
    slug = models.SlugField(unique=True, db_index=True, blank=True) 

    def save(self): 
     self.slug ="%d%s" %(self.pk, slugify(self.title)) 
     super(B, self).save() 

serializers.pyを得た問題は、あなたが受け入れなかったということです

class ASerializer(serializers.ModelSerializer): 

    class Meta: 
     model = A 
     fields = "__all__" 


class BSerilizer(serializers.ModelSerializer): 
    a = ASerializer(many=False, required=False, allow_null=True) 
    slug = serializers.SlugField(read_only=True) 

    class Meta: 
     model = B 
     fields = '__all__' 

    def create(self, validated_data): 
     info_data = validated_data.pop('ad_info') 
     A.objects.create(**info_data) 
     ad = B.objects.update_or_create(**validated_data) 
     A.objects.update_or_create(ad_info=adgame, **info_data) 
     ad.save() 
     return ad 
+0

コードのコピー/貼り付け+修正が正しく行われませんでした(構文の強調表示を参照)。 –

答えて

1

を更新すべきだと思うだけでなく、あなたの問題がありますモデルAとモデルBを作成しようとしています。モデルBはモデルAの主キーに依存しています。この構造はモデルAを作成しており、モデルBには関連がなく、モデルAをもう一度作成しています。 あなただけのモデルAを作成する必要があり、その後、モデルBが、あなたはモデルAにモデルBのIDを参照する必要があり、私はその混乱を知っているが、これを試してみてください。

def create(self, validated_data): 
    info_data = validated_data.pop('ad_info') 
    info = A.objects.create(**info_data) 
    ad = B.objects.create(pk=info.id, **validated_data) 
    return ad 

PK = info.idするためのキーでありますこの問題。

2

Bのsaveメソッドのデフォルト引数。一般に、メソッドをオーバーライドするときは、渡すことができるすべての引数を受け入れ、スーパークラスメソッドに渡すことを確認する必要があります。それを行う1つの方法は、*args, **kwargsである:

def save(self, *args, **kwargs): 
    self.slug ="%d%s" % (self.pk, slugify(self.title)) 
    super(B, self).save(*args, **kwargs) 
+0

tnx問題は解決しましたが、新しい問題があります:エラーバインディングパラメータ0 - おそらくサポートされていないタイプです。 \t /env/lib/python3.5/site-packages/django/db/backends/sqlite3/operations.py _quote_params_for_last_executed_query、行125.A.objects.update_or_create(info_data、info_data)@danielRoseman – taghiss

1

あなたはトン@Danielローズマンによる修正が行われた後、あなたはAインスタンスの新しいインスタンスを使用してvalidated_data

def create(self, validated_data): 
    info_data = validated_data.pop('ad_info') 
    # Next two rows 
    a = A.objects.create(**info_data) 
    validated_data.update({'a': a}) 
    ad = B.objects.update_or_create(**validated_data) 
    A.objects.update_or_create(ad_info=adgame, **info_data) 
    ad.save() 
    return ad 
+0

が変更されましたあなたが言ったようにコード:.now私はデータベースからの整合性エラーを取得する:UNIQUE制約が失敗しました:store_b.slug – taghiss

+0

私はスラッグフィールドは、データベースに公開されていると考えています – taghiss

+0

私はハードリフレッシュして、エラーバインディングパラメータ3 - おそらくサポートされていないタイプです。私の構造が間違っていると思いますか?これは、ジャンゴrestframeworkでOneToOne関係を作成するための適切な方法ですか? – taghiss

関連する問題