Django change Models relations depending on condition (if is staff or not)
I have 2 Moles, User and Account. The User can be staff or normal User.
In general a User can have just one Account.
This is what I have now:
class User(AbstractBaseUser):
account = models.OneToOneField(Account, null=True, on_delete=models.CASCADE)
but in special cases an User can have multiple or no Account, only if the User is_staff.
The logic is to have now a ForeignKey:
class User(AbstractBaseUser):
account = models.ForeignKey(Account, on_delete=models.CASCADE)
But in this case, how do I stop in Django Admin or else, for a User to have multiple Foreign keys if is not staff, and force it for normal users to have a simulated OneToOne Relation.
django django-models
add a comment |
I have 2 Moles, User and Account. The User can be staff or normal User.
In general a User can have just one Account.
This is what I have now:
class User(AbstractBaseUser):
account = models.OneToOneField(Account, null=True, on_delete=models.CASCADE)
but in special cases an User can have multiple or no Account, only if the User is_staff.
The logic is to have now a ForeignKey:
class User(AbstractBaseUser):
account = models.ForeignKey(Account, on_delete=models.CASCADE)
But in this case, how do I stop in Django Admin or else, for a User to have multiple Foreign keys if is not staff, and force it for normal users to have a simulated OneToOne Relation.
django django-models
2
Why don't you handle this validation inUser.save()
? There you know if the the useris_staff=True
and you can raiseValidationError
if it doesn't match your rules.
– Alex
Nov 22 '18 at 20:33
add a comment |
I have 2 Moles, User and Account. The User can be staff or normal User.
In general a User can have just one Account.
This is what I have now:
class User(AbstractBaseUser):
account = models.OneToOneField(Account, null=True, on_delete=models.CASCADE)
but in special cases an User can have multiple or no Account, only if the User is_staff.
The logic is to have now a ForeignKey:
class User(AbstractBaseUser):
account = models.ForeignKey(Account, on_delete=models.CASCADE)
But in this case, how do I stop in Django Admin or else, for a User to have multiple Foreign keys if is not staff, and force it for normal users to have a simulated OneToOne Relation.
django django-models
I have 2 Moles, User and Account. The User can be staff or normal User.
In general a User can have just one Account.
This is what I have now:
class User(AbstractBaseUser):
account = models.OneToOneField(Account, null=True, on_delete=models.CASCADE)
but in special cases an User can have multiple or no Account, only if the User is_staff.
The logic is to have now a ForeignKey:
class User(AbstractBaseUser):
account = models.ForeignKey(Account, on_delete=models.CASCADE)
But in this case, how do I stop in Django Admin or else, for a User to have multiple Foreign keys if is not staff, and force it for normal users to have a simulated OneToOne Relation.
django django-models
django django-models
asked Nov 22 '18 at 20:21
user3541631user3541631
1,17621634
1,17621634
2
Why don't you handle this validation inUser.save()
? There you know if the the useris_staff=True
and you can raiseValidationError
if it doesn't match your rules.
– Alex
Nov 22 '18 at 20:33
add a comment |
2
Why don't you handle this validation inUser.save()
? There you know if the the useris_staff=True
and you can raiseValidationError
if it doesn't match your rules.
– Alex
Nov 22 '18 at 20:33
2
2
Why don't you handle this validation in
User.save()
? There you know if the the user is_staff=True
and you can raise ValidationError
if it doesn't match your rules.– Alex
Nov 22 '18 at 20:33
Why don't you handle this validation in
User.save()
? There you know if the the user is_staff=True
and you can raise ValidationError
if it doesn't match your rules.– Alex
Nov 22 '18 at 20:33
add a comment |
1 Answer
1
active
oldest
votes
If you want to do a Many-to-one relation where one staff User can have multiple accounts, is your Account model that should contain your foreign key. Also, you can override your Account's save model to reinforce your condition using a code similar to this:
class Account(...):
user = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
user = self.user
if user and user.set_account.count() > 0 and not user.is_staff:
raise ValidationError(_('You cannot add another account to user {}'.format(user.username)))
super(Account, self).save(*args, **kwargs)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437601%2fdjango-change-models-relations-depending-on-condition-if-is-staff-or-not%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
If you want to do a Many-to-one relation where one staff User can have multiple accounts, is your Account model that should contain your foreign key. Also, you can override your Account's save model to reinforce your condition using a code similar to this:
class Account(...):
user = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
user = self.user
if user and user.set_account.count() > 0 and not user.is_staff:
raise ValidationError(_('You cannot add another account to user {}'.format(user.username)))
super(Account, self).save(*args, **kwargs)
add a comment |
If you want to do a Many-to-one relation where one staff User can have multiple accounts, is your Account model that should contain your foreign key. Also, you can override your Account's save model to reinforce your condition using a code similar to this:
class Account(...):
user = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
user = self.user
if user and user.set_account.count() > 0 and not user.is_staff:
raise ValidationError(_('You cannot add another account to user {}'.format(user.username)))
super(Account, self).save(*args, **kwargs)
add a comment |
If you want to do a Many-to-one relation where one staff User can have multiple accounts, is your Account model that should contain your foreign key. Also, you can override your Account's save model to reinforce your condition using a code similar to this:
class Account(...):
user = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
user = self.user
if user and user.set_account.count() > 0 and not user.is_staff:
raise ValidationError(_('You cannot add another account to user {}'.format(user.username)))
super(Account, self).save(*args, **kwargs)
If you want to do a Many-to-one relation where one staff User can have multiple accounts, is your Account model that should contain your foreign key. Also, you can override your Account's save model to reinforce your condition using a code similar to this:
class Account(...):
user = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
user = self.user
if user and user.set_account.count() > 0 and not user.is_staff:
raise ValidationError(_('You cannot add another account to user {}'.format(user.username)))
super(Account, self).save(*args, **kwargs)
answered Nov 22 '18 at 21:33
Aurora WangAurora Wang
733316
733316
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437601%2fdjango-change-models-relations-depending-on-condition-if-is-staff-or-not%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
Why don't you handle this validation in
User.save()
? There you know if the the useris_staff=True
and you can raiseValidationError
if it doesn't match your rules.– Alex
Nov 22 '18 at 20:33