Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Models not Showing Up in DB after syncdb

I have a models folder that has a few models in files that are already in the DB. I have just added another file/model but it is not being added to the DB when I run syncdb. I've tried manage.py validate and it is running fine. I have also run the code and it only fails when it tries to save with "table does not exist".

the original structure was like this:
/models
-- __init__.py
-- file1.py
-- file2.py

and __init__.py looked like:

from file1 import File1Model
from file2 import File2Model

I added file3.py
/models
-- __init__.py
-- file1.py
-- file2.py
-- file3.py

and modified __init__.py

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

And the contents of file3 (names may have been changed to protect the innocent, but besides that its the exact file):
UPDATE: just tried adding a primary key since the id field may have been messing with the automatically added integer primary key id. Also tried a few variations but no dice.

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

So in this example, File1Model and File2Model are already in the DB and remain in the DB after syncdb. However, File3Model is not added even after rerunning syncdb. Is there any way to figure out why the new model isn't being added??

like image 449
ntrrobng Avatar asked May 31 '12 15:05

ntrrobng


2 Answers

If you define the model outside of models.py, you have to set the app_label attribute on the models Meta class.

Edit: The app_label has to refer to an app in your INSTALLED_APPS setting. It should probably match the name of the app that the models directory is in, unless you've got a really good reason to do otherwise. That seems to have been your problem here.

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

    class Meta:
        app_label = "my_app"

Note that syncdb will never remove any tables from the db. The other tables were probably created with syncdb before the models.py was replaced with the directory structure.

like image 149
Alasdair Avatar answered Sep 19 '22 13:09

Alasdair


set app_label to my app solves my problem.

like image 44
think2010 Avatar answered Sep 22 '22 13:09

think2010