2011-08-17 2 views
6

이 코드가 중복 항목 (IntegrityError)을 발생시키는 이유를 이해할 수 있도록 도와 줄 수 있습니까?Django - get_or_create가 작동하지 않습니다.

나는 장고 1.2에 있습니다.

(row, is_new) = MyModel.objects.get_or_create(field1=1) 
row.other_field = 2 
row.save() 

필드 1에 고유 한 제한 사항이 있습니다. field1 = 1 인 행이 있으면 모든 것이 정상적으로 작동하고 장고는 "get"을 수행합니다.

field1 = 1 인 행이 없으면 Django가 해당 행을 만드는 것처럼 보입니다. 그런데 왜 내가 그것을 구할 수 없을까?

업데이트 :

class MyModel(models.Model): 
    id = models.BigIntegerField(primary_key=True) 
    field1 = models.BigIntegerField(unique=True) 
    other_field = models.CharField(max_length=765) 
    class Meta: 
     db_table = u'project_crosses_suppl_FO' 

필드 1은 다른 테이블에 외래 키 : 도움이된다면

, 여기 MyModel입니다. 하지만 장고에서이 테이블에 대한 모델을 만들지 않았으므로 장고에 외래 키라고 말하지 않습니다.

+0

합니까 MyModel 외국 필드가 : 행은 따라서이 당신을 위해 작동합니다, 하나의 객체와 튜플인가? MyModel 코드를 게시 할 수 있습니까? –

+1

[이 비슷한 질문] (http://stackoverflow.com/questions/6974463/django-get-or-create-raises-duplicate-entry-with-together-unique) 도움이 될 수도 있습니다. – agf

+0

@agf. 나는 그 문제의 해결책이 무엇인지, 또는 그 문제가 어떻게 정당화되는지 이해하지 못한다. 나에게 벌레처럼 들린다. get_or_create를 포기하고 주위를 해결할 것이라고 생각합니다 :-( – Greg

답변

3

get_or_create 소리가 나에게 들렸습니다. 난 그냥 주위에이 일을하고 있어요 :

rows = MyModel.objects.filter(field1=1) 
row = rows[0] if rows else MyModel(field1=1) 
row.other_field = 2 
row.save() 
7

을 그 실제 코드를 합리적으로 충실한 표현의 가정,하지 놀랍게도 그 체포 것 장고 아니에요, 그것은 당신의 모델입니다.

자동 기본 키 필드를 자신의 id 필드로 재정의했지만 자동 증가로 설정하지 않았습니다. 따라서 데이터베이스가 PK에 대한 새 값을 사용하지 않으므로 무결성 오류가 발생합니다.

정말 좋은 이유가 없으면 장고가 PK 필드 자체를 처리하도록해야합니다.

+1

오, 좋은 지적입니다. 변경할 수없는 기존 테이블입니다. 왜 내가 장고에게 기본 키가 무엇인지 알려주고있다. 그래서 정확히 바뀌어야 할 것인가? MySQL 테이블의 "id"열은 실제로 자동 증가로 설정된다. 장고에 자동 증가 필드가 필요 할까? – Greg

+0

@ 그렉, 벌써 해봤 니? – Kirill

1

사용 또는 생성하면 사용하는 필드가 기본 키 또는 고유로 설정되어 있어도 결과의 튜플을 반환합니다. 귀하의 경우 그래서

:

(row, is_new) = MyModel.objects.get_or_create(field1=1) 
row[0].other_field = 2 
row[0].save() 
관련 문제