2017-12-30 2 views
2

내 프로젝트에는 두 개의 모델이 있습니다. 모델 A와 B. 모델 B는 모델 A와 'OneToOne'관계가 있습니다. 모델 B에 대한 serializer 클래스를 ".create()"함수에 작성했습니다. 저장을 재정의해야하므로 모델 B를 저장하는 데 문제가 있습니다.() 함수는 슬러그 값을 삽입하기 위해 B 모델에서 작동합니다. 오류 :django restframework _ OneToOne field 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 인스턴스의 새로운 인스턴스로 validated_data를 업데이트해야한다고 생각 당신은 모델 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 메소드의 기본 인수. 일반적으로 메서드를 재정의 할 때는 전달할 수있는 모든 인수를 수락하고이를 수퍼 클래스 메서드에 전달해야합니다. 그 일을하는 한 가지 방법은 *args, **kwargs 함께 :

당신이 @Daniel Roseman에 의해 수정을 완료 한 후
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

은 t

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

변경됨 당신이 말한대로 코드.. 내가 데이터베이스에서 무결성 오류를 얻을 : UNIQUE 제약 실패 : store_b.slug – taghiss

+0

내가 만든 슬러그 필드가 데이터베이스에 dublicated지고 있다고 생각 – taghiss

+0

나는 열심히 새로 고침을했고 다른 요청을했다.이 오류를 다시 : 오류 바인딩 매개 변수 3 - 아마도 지원되지 않는 유형입니다. . 왜 내 구조가 잘못됐다고 생각하니? 내가 장고 restframework에 OneToOne 관계를 만드는이 적절한 방법입니까? – taghiss

관련 문제