2011-08-07 11 views
26

modelowego przykładuDjango: get_or_create Podnosi duplikat wpisu z together_unique

class Example(Stat): 
    numeric = models.IntegerField(...) 
    date = models.DateField(auto_now_add=True,...) #auto_now_add=True was the problem 

    class Meta: 
     unique_together = ('numeric','date') 

)

If 72 i '2011-08-07' jest już zapisany

Example.object.get_or_create(numeric=72,date='2011-08-07') 

podnosi

django.db.utils.IntegrityError: (1062, "Duplicate entry '72-2011-08-07' 

pytanie brzmi: dlaczego get_or_create podnosi IntegrityError, to pomysł użycia get_or_create.

Nie wiem, czy jest to błąd, otworzyłem bilet https://code.djangoproject.com/ticket/16587

+0

Przepraszam, jeśli nie było jasne pytanie. Edytowałem pytanie, mam nadzieję, że teraz jest lepiej – llazzaro

+0

Czy po prostu zwykły 'get' z tymi samymi argumentami EXACT, jak' get_or_create' zwraca element? – agf

Odpowiedz

17

Wydaje się, problem jest z istnieniem więcej kolumn nie jesteś w tym w swojej get_or_create patrz tj this thread na liście dyskusyjnej Django.

Trzeba użyć parametru get_or_createdefaults jak opisano w docs lub podać wartości dla wszystkich kolumn, na get_or_create dopasować prawidłowo.

+1

Rozumiem, że tego typu użycie potrzebowałabym wartości domyślnych, ale moje parametry w get_or_create są całymi polami dostępnymi w klasie. W każdym razie ta informacja bardzo pomogła. Również jeśli usunę unikalny_, to działa get_or_create. – llazzaro

+0

'get_or_create' jest również częściowo wrażliwy na wielkość liter - jeśli mają one inny przypadek, nie znajdzie dopasowania, ale możesz jeszcze uderzyć w ograniczenie unikalności. – agf

+2

Rozwiązałem problem czytając twoją odpowiedź. DateField używał auto_now_add = True, więc uniknąłem ważnych informacji w moim pytaniu. Aby rozwiązać auto_now_add = Fałsz działa teraz – llazzaro

Powiązane problemy