2011-08-30 2 views
3

도움말! 이걸 알아낼 수 없어요! 기본 매개 변수가 설정된 경우에도 get_or_create에서 무결성 오류가 발생합니다.Django get_or_create raise 기본 키와 중복되는 항목

다음은 모델의 외형을 벗겨내는 방법입니다.

class Example(models.Model):model 
    user   = models.ForeignKey(User) 
    text   = models.TextField() 

def __unicode__(self): 
    return "Example" 

내가 장고에이 실행

def create_example_model(user, textJson): 
    defaults = {text: textJson.get("text", "undefined")} 

    model, created = models.Example.objects.get_or_create(
      user=user, 
      id=textJson.get("id", None), 
      defaults=defaults) 

    if not created: 
     model.text = textJson.get("text", "undefined") 
     model.save() 

    return model 

나는 get_or_create 줄에 오류를 받고 있어요 :

IntegrityError: (1062, "Duplicate entry '3020' for key 'PRIMARY'") 

그것은 라이브입니다 그래서 난 정말 어떤 입력을 말할 수 없다 입니다.

도움 말? 실제로는 기본값이 설정되어 있으므로 기본값이 아닌이 문제는 아닙니다. 게다가 독특한 것은 아닙니다. Django : get_or_create Raises duplicate entry with together_unique

저는 파이썬 2.6과 mysql을 사용하고 있습니다.

답변

1

일반적으로 개체의 ID를 설정하면 안되므로 신중해야합니다.

데이터베이스에 넣는 'id'값을 확인 했습니까?

문제가 해결되지 않으면 데이터베이스 문제 일 수 있습니다. PostgreSQL의 경우 ID를 증가시키는 데 사용되는 특수 시퀀스가 ​​있으며 때로는 증가하지 않습니다. 다음과 같은 뭔가 :

SELECT setval에 ( tablename_id_seq FROM 'tablename_id_seq'(SELECT MAX (ID) + 1));

+0

id는 이미 존재하는 경우에만 설정됩니다. id가 null이면 데이터베이스에서 자동으로 생성됩니다 (자동 증가). 적어도 그것이 내가 이해 한 것입니다. – Kenneth

2

get_or_create()은 당신이 전달 인자에 정확한 일치 하나를 찾을 수없는 경우 새 개체를 만들려고합니다.

을 그래서 것이 무엇인지 나는 무슨 일이 일어나고 있으리라 믿고있어입니다 다른 사용자가 3020이라는 ID를 가진 객체를 만들었습니다. 요청한 사용자/ID 조합이있는 객체가 없으므로 해당 객체는 해당 콤보로 새 객체를 만들려고 시도하지만 다른 사용자가 이미 ID가 3020 인 항목입니다.

희망적으로는 의미가 있습니다. 다음 결과가 무엇인지 확인하십시오. 계속 된 일에 대해 약간의 통찰력을 줄 수도 있습니다.

models.Example.objects.get(id=3020) 

검색시 문자열을 3020으로 만들 필요가 있습니다. 문자열이 당신의 textJson.get() 메쏘드에서 돌아오고 있다고 가정합니다.

+0

개체가 한 사용자 아래에 있습니다. 동시 요청이 진행될 수 있습니까? – Kenneth

+0

해당 개체가 이미 존재하면 다른 개체를 사용하여 다른 개체를 만들려고 시도하지만 고유 한 ID를 할당하게됩니다. 그래서 오류가 발생합니다. 동시 요청과 관련이 없어야합니다. –

관련 문제