2011-06-20 7 views
8

edycja: Nie było jasne wcześniej, zapisuję mój obiekt w panelu administracyjnym django, a nie w widok. Nawet gdy zapiszę obiekt bez relacji wiele do wielu, nadal otrzymuję błąd.Administrator Django - instancja musi mieć wartość klucza podstawowego, zanim można zastosować relację wiele do wielu.

mam model o nazwie TogglDetails, który ma związek z ForeignKey standardowego modelu Django User i MayToManyField związek z modelem o nazwie Tag. Zarejestrowałem swoje modele z administratorem django, ale kiedy próbuję zapisać instancję TogglDetails, otrzymuję błąd w tytule.

Oto moje modele:

class Tag(models.Model): 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.name 


class TogglDetails(models.Model): 
    token = models.CharField(max_length=100) 
    user = models.ForeignKey(User) 
    tags = models.ManyToManyField(Tag, blank=True, null=True) 

    def __unicode__(self): 
     return self.user.username 

    class Meta: 
     verbose_name_plural = "toggl details" 

O ile wiem, nie powinno być żadnych problemów z moich modeli i Django Administrator powinien po prostu zapisać instancji bez żadnych problemów. Czy jest coś oczywistego, co przeoczyłem?

Używam Django 1.3

+0

Mam ten sam problem jak dobrze ... I nie wydają się go pamiętać przed .. kto wie . –

+0

czy możesz wkleić błąd? – ghostJago

Odpowiedz

0

Nie pozwól nam odgadnąć i dodać komunikat o błędzie do Twojego pytania, to daje najwięcej informacji o tym, gdzie to się nie powiedzie.

Czy zaimportowałeś model użytkownika?

from django.contrib.auth.models import User 
+0

Tak Zaimportowałem model użytkownika, komunikat o błędzie znajduje się w tytule "ValueError:" Instancja TogglDetails musi mieć wartość klucza podstawowego, zanim będzie można użyć relacji wielu do wielu. " –

0

Miałem również ten problem i jedyne, co mogłem zrobić, to uczynić pola M2M puste i nie ustawiać ich, dopóki nie uderzę Zapisz i kontynuuj edytowanie.

Myślę, że to może być brodawka ramowa, ponieważ zauważysz, że sekcja User na stronie Admin ma również bardzo ścisłe "Możesz edytować te pola tylko do momentu zapisania modelu".

Tak więc, moim zaleceniem jest przyjęcie tego schematu i ukrycie pola formularza M2M, dopóki model nie uzyska klucza podstawowego.

0

Próbowałem Django 1.3 przy użyciu CPython, z różnymi konfiguracjami bazy danych. Kopiować, wklejać modele z pytaniem, i zrobił kilka zmian: najpierw dodałem

from django.contrib.auth.models import User 

na początku pliku i umieścić odniesienie do Tag między cytatami. To nie powinno robić żadnej różnicy. Ponadto stworzyłem następujące admin.py:

from django.contrib import admin 
import models 

admin.site.register(models.Tag) 
admin.site.register(models.TogglDetails) 

sqlite3, problem opisany nie występuje, ani dla MySQL. Więc spróbowałem PostgreSQL, z końcówką postgresql_psycopg2. To samo: nie mogę odtworzyć błędu.

O ile wiem, nie ma nic złego w kodzie w pytaniu. Problem musi być gdzie indziej.

3

Jak stwierdzono przez innych użytkowników:

PostgreSQL sekwencji bez przeprowadzenia „własnością” atrybutu nie zwróci identyfikator w Django 1.3

Sekwencje w mojej bazy danych PostgreSQL nie mają „Własnością” zestaw atrybutów i tak nie zwróci identyfikator kiedy nowy wpis został zapisany w db

Ponadto: Jest to najprawdopodobniej spowodowane przez niekompatybilną wstecz zmianę, która powoduje, że niektóre podstawowe typy kluczy w niestandardowych modelach są poza zasięgiem dla Django 1.3. Aby uzyskać więcej informacji, zobacz bilety Django trac https://code.djangoproject.com/ticket/13295 i http://code.djangoproject.com/ticket/15682.

Rozwiązałem problem, uruchamiając następujące polecenia dla dotkniętych tabel/sekwencji.

szczególności uruchamiając polecenie:

manage.py dbshell 
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname; 

zmiany tablename_colname_seq i tablename.colname

Powiązane problemy