2013-11-11 7 views
0

У меня есть User модель:Джанго ForeignKey авто поле

class User(models.Model): 
    SEX = (
     ('M', 'Male'), 
     ('F', 'Female'), 
    ) 
    name = models.CharField("Name", max_length=100, blank=False) 
    surname = models.CharField("Surname",max_length=150, blank=False) 
    is_real = models.BooleanField("Real user", default=False) 
    sex = models.CharField("Sex", max_length=1, choices=SEX) 
    age = models.IntegerField("Age", blank=False) 

Каждый User имеет электронную почту или некоторые из них:

class Email(models.Model): 
    address = models.EmailField("Email Address", max_length=250) 
    login = models.CharField("Login", max_length=50) 
    password = models.CharField("Password", max_length=15) 
    date_created = models.DateField("Registered", auto_now_add=True) 
    last_login = models.DateTimeField("Last login") 
    belongs_to = models.ForeignKey(User, verbose_name="Owner") 

Также User может иметь блог:

class Blog(models.Model): 
    address = models.URLField("Blog Url") 
    related_email = models.ForeignKey(Email, verbose_name="Registered with") 
    belongs_to = models.ForeignKey(User, blank=True) 

Блоги обычно регистрируются по электронной почте. Так что мне нужно, если я не указал владельца блога, он должен автоматически устанавливаться владельцем регистрационного письма. Я думаю, что это можно сделать, переопределив метод save, но не совсем уверен, как справиться с отношениями ForeignKey.

ответ

2

Не могли бы вы сделать что-то подобное?

def save(self, *args, **kwargs): 
    if not self.belongs_to: 
     self.belongs_to = self.related_email.belongs_to 
    return super(Blog, self).save(*args, **kwargs) 
+0

Я думал о чем-то подобном. Я немного сомневался, но снова просмотрел документы и да, вы правы. А как насчет 'null = True' или' blank = True'? –

+0

Да, вы должны, вероятно, добавить 'null = True' в' Blog.belongs_to' – jproffitt

0

Во-первых, добавьте null = True к Blog.belongs_to

Предполагая, что вы знаете владельца регистрации адрес электронной почты, вы можете сделать

owner = User.objects.get(field = value) 
email = Email.objects.get(belongs_to = owner) 
Blog.objects.create(address = ..., related_email = email, belongs_to = None) 

И тогда вы должны должны делать какие-либо обновления, вы можете do

blog = Blog.objects.filter(related_email = email).filter(belongs_to__isnull = True) 
blog.belongs_to = newUserObject 
Смежные вопросы