2012-07-24 4 views
1

외래 키 집합과 함께 django에서 중복 키 무결성 오류가 발생했습니다.Django IntegrityError 외래 키 중복 항목

나는 다음과 같은 기능을 가지고 :

def update_relationship(actor, action, status, target): 
    existing = Relation.objects.filter(actor=actor, target=target) 

    # If this relation is 'on', turn it off 
    if Relation.objects.filter(actor=actor, target=target, status=status): 
    Relation.objects.filter(actor=actor, target=target).update(status="") 
    # If this relationship is not on, turn it on 
    else: 
    created = True 
    if existing: 
     existing.update(status=status) 
    else: 
     Relation.objects.create(actor=actor, target=target, status=status) 

당신은 내가 관계가 데이터베이스에 이미 존재하는지 테스트 한 후이 존재하는 경우를 업데이트하고이를 경우 새 행을 만드는 오전 볼 수 있듯이 하지 않습니다. 그러나, 내가 재현 할 수없는 몇 가지 조건에서 장고는 나에게 중복 키 에러를주고있다. 심지어 내가 말할 수있는 한 그것의 인스턴스가 하나 밖에없는 상황에서도. existence를 확인하기 위해 모든

class Relation(models.Model): 
    Status = Choices(('L', 'Like', 'Like'), 
        ('D', 'Dislike', 'Dislike'), 
        ('S', 'Save', 'Save')) 
    actor  = models.ForeignKey('members.Member', related_name='relations') 
    target = models.ForeignKey('members.Member', related_name='reverse_relations') 
    status = models.CharField(choices=Status, max_length=10) 
    created = models.DateTimeField('created', auto_now_add=True) 

    notified  = models.BooleanField(default=False) 
    notified_mutual = models.BooleanField(default=False) 

    class Meta: 
    unique_together = (('actor', 'target'),) 
    ordering = ('created',) 
    verbose_name = 'Relation' 
    verbose_name_plural = 'Relations' 

답변

2

첫째, 올바른 표현된다 :

existing = Relation.objects.filter(actor=actor, target=target).exists() 

하지만 당신의 문장을 함께 작성하는 djano 방법 참고로

, 여기에 모델 정의입니다 get_or_create 방법은 찾고있는 방법입니다.

Relation.objects.get_or_create(actor=actor, target=target, 
           defaults={ 'status':status } 
          ) 

또는 귀하의 경우에, 무엇인가 : 장고는 update_or_create 방법을했지만, 이건 내 방법보다 더 좋은 방법이 될 것 같다 경우

r, _ = Relation.objects.get_or_create(actor=actor, target=target) 
r.status = '' if r.status == 'on' else status 
r.save() 
+0

이 가지 좋을 것입니다. 감사! – ChrisBurnor

+0

확인. 이상하게도 이것은 장고 get_or_create를 사용하여도 여전히 발생합니다. 아마도 기본값을 설정하지 않았기 때문일 것이라고 생각했지만 기본값으로도 여전히 발생합니다. – ChrisBurnor