2012-05-31 10 views
6

Mam folder modeli, który ma kilka modeli w plikach, które są już w DB. Właśnie dodałem kolejny plik/model, ale nie jest on dodawany do bazy danych, gdy uruchamiam syncdb. Próbowałem sprawdzać poprawność manage.py i działa poprawnie. Uruchomiłem również kod, który kończy się niepowodzeniem, gdy próbuje zapisać, gdy "tabela nie istnieje".Modele Django nie są wyświetlane w DB po Syncdb

oryginalna struktura była tak:
/Modele
- __ init, __ .py
- file1.py
- file2.py

i __ init, __ .py wyglądało:

from file1 import File1Model 
from file2 import File2Model 

dodałem file3.py
/modeli
- __ init, __ .py
- file1.py
- file2.py
- file3.py

i modyfikowane __ init, __ .py

from file1 import File1Model 
from file2 import File2Model 
from file3 import File3Model 

Zawartość pliku3 (nazwy mogły zostać zmienione w celu ochrony niewinnych, ale poza tym jest to dokładny plik):
AKTUALIZACJA: próbowano po prostu dodać klucz podstawowy, ponieważ pole identyfikatora mogło być mieszane z automatycznie dodanymi Liczba całkowita klucza podstawowego. Wypróbowałem również kilka odmian, ale bez kości.

from django.db import models 
from django.contrib.auth.models import User 


class File3Model(models.Model): 
    user = models.OneToOneField(User) 
    token = models.CharField(max_length=255, blank=False, null=False) 
    id = models.CharField(primary_key=True, max_length=255) 

    class Admin: 
     pass 

    class Meta: 
     app_label = 'coolabel' 

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

    @staticmethod 
    def getinstance(user, token, id): 
     try: 
      instance = File3Model.objects.get(pk=id) 
      if instance.token != token: 
       instance.token = token 
       instance.save() 
      return instance 
     except: 
      pass 
     instance = File3Model() 
     instance.user = user 
     instance.token = token 
     instance.id = id 
     instance.save() 
     return instance 

Tak więc w tym przykładzie File1Model i File2Model są już w DB i pozostają w DB po syncdb. Jednak File3Model nie jest dodawany nawet po ponownym uruchomieniu syncdb. Czy istnieje sposób, aby dowiedzieć się, dlaczego nowy model nie jest dodawany?

+0

Czy wypróbowałeś 'syncdb --all'? – sultan

+0

próbowałem, ale wciąż nie działa. – ntrrobng

Odpowiedz

0

BOOM!

Używałem innej etykiety_aplikacji_włączenia dla nowego modelu, ale musi ona być taka sama w całej grupie modeli.

Pozostałe modele etykiet to "miernik etykiet", a mój nowy model ma etykietę "coolabel". Zmieniłem etykietę nowego modelu na "mediocrelabel", a teraz są one poprawnie dodawane do DB.

Dzięki za pomoc, ludzie!

9

Jeśli zdefiniujesz model poza modelem.py, musisz ustawić atrybut app_label na klasie modeli Meta.

Edytuj: app_label musi odnosić się do aplikacji w ustawieniu INSTALLED_APPS. Powinien prawdopodobnie pasować do nazwy aplikacji, w której znajduje się katalog modeli, chyba że masz naprawdę dobry powód, by postąpić inaczej. To chyba był twój problem tutaj.

class File3Model(models.Model): 
    foo = models.CharField(...) 
    ... 

    class Meta: 
     app_label = "my_app" 

Zauważ, że syncdb nigdy nie usunie żadnych tabel z db. Pozostałe tabele zostały prawdopodobnie utworzone z syncdb, zanim model .py zostanie zastąpiony strukturą katalogów.

+0

Pole app_label jest ustawione w klasie Meta, ale nadal nie jest dodawane do bazy danych. – ntrrobng

+0

Etykieta "app_label" musi być aplikacją w ustawieniu 'INSTALLED_APPS'. Dodałem to do odpowiedzi. – Alasdair

0

Dlaczego podzieliłeś modele i posiadasz folder modeli zamiast umieszczać modele w models.py?

W moim własnym projekcie jest około 10 modeli na żywo w models.py i mam z tym wszystko.

Możesz także wypróbować manage.py syncdb --all.

Uważam, że lepiej jest przechowywać wszystkie modele w jednym pliku i zaimportować je tak, jak from my_app.models import model_name zamiast pamiętać o zaimportowaniu niezbędnego modelu do models/__init__.py. Nawiasem mówiąc, unikasz wielu problemów i długiego importu i nie interesuje Cię, gdzie some_model mieszka wśród plików models/*.py.

Dzięki,

Sultan

+0

Dziękuję za radę. Jednak pracuję z istniejącym kodem i pomyślałem, że głupotą byłoby przeniesienie wszystkiego z powrotem do pliku models.py. Wolałbym zachować wszystko w katalogu modeli. – ntrrobng

1

Zestaw app_label do mojej aplikacji rozwiązuje mój problem.