On Friday 19 May 2017 00:19:04 Tobias Dacoir wrote:
> No, I am trying to deploy it locally. I have no sqlite DB and no
> migrations. For some strange reason I used to just run manage.py
> makemigrations and would create the initial migrations for all Apps.
> This doesn't work for some reason anymore. So I have to to
> makemigrations APPname for each app and when I run to migrate to
> create the intial database schema, it doesn't work. So I figured my
> Data Model is crap.
Yep, let me see if I got it right:
- The User model is defined as AUTH_USER_MODEL in settings.py
- User points to institute
- Institute points to User
So it is in fact a circular dependency on the model level as well. And one you
don't need.
>From the way you defined the related_name it is also clear you don't get the
>RelatedObject
principle of Django.
A ForeignKey creates a bridge between two models: you can travel in both
directions. Using
your models:
class User(AbstractBaseUser, PermissionsMixin):
username = ...
class Institute(models.Model):
master_user = models.ForeignKey(settings.AUTH_USER_MODEL,
related_name='institute')
members = models.ManyToManyField(settings.AUTH_USER_MODEL)
Because of the ForeignKey on Institute, Django creates an attribute on User,
called 'institute'. It
uses institute, because I specified that as related_name. You could use a
different name there,
but it has to be a name that can be used on the model you point to.
However, this isn't a good representation of realitity, given your own
description.
So this is a better way to do it:
class User(AbstractBaseUser, PermissionsMixin):
institute = models.ForeignKey('port.Institute', related_name='members')
is_master_user = models.BooleanField(default=False)
class Institute(models.Model)
name = models.CharField(max_length=255)
# members is now created by the foreign key
@property
def master_user(self):
return self.members.get(is_master_user=True)
This model is much simpler. All you need to do is to verify that when someone
is made master
user, that all other members of the institute are *not* master user.
You can do this in a post_save signal or in the clean method of User , both
with its own caveats.
Another way would be to define a MasterUser model, which is easier to maintain
in the admin:
class MasterUser(models.Model):
# Assume one person can be master user of many institutes
# if not, this also has to be a OneToOneFIeld
user = models.ForeignKey(settings.AUTH_USER_MODEL)
institute = models.OneToOneField(Institute, related_name='master_user')
> On Wednesday, May 17, 2017 at 5:41:41 PM UTC+2, Melvyn Sopacua wrote:
> > On Wednesday 17 May 2017 05:57:57 Tobias Dacoir wrote:
> > > Thanks Melvyn,
> > >
> > >
> > >
> > > I used promises before, when I use a foreign key for a class that
> > > is
> > >
> > > not yet defined, however it didn't change anything for my problem.
> > > I
> > >
> > > can make migrations, but not migrate. I am starting with a new
> > >
> > > database from scratch.
> > >
> > > self.ensure_not_cyclic(target, lambda x: (parent.key for parent in
> > >
> > > self. node_map[x].parents))
> > >
> > > File
> > >
> > > "/Users/no68tuh2/.virtualenvs/ihearu/lib/python2.7/site-packages/d
> > > jang
> > >
> > > o/db/migrations/graph.py" , line 370, in ensure_not_cyclic
> > >
> > > raise CircularDependencyError(", ".join("%s.%s" % n for n in
> > >
> > > cycle)) django.db.migrations.exceptions.CircularDependencyError:
> > >
> > > play.0001_initial, portal.0001_initial
> > >
> > >
> > >
> > > This CircularDependencyError is driving me crazy.
> >
> > Ah, now I see!
> >
> > This has nothing to do with *model* dependencies. Two *migrations*
> > depend on each other: play and port, both 0001_initial.
> >
> >
> >
> > Do you have any idea how you got into that jam? Did you fiddle with
> > django_migrations table? Maybe run --fake?
> >
> >
> > Melvyn Sopacua
--
Melvyn Sopacua
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/4128807.5j0HffSdr9%40devstation.
For more options, visit https://groups.google.com/d/optout.