2013-06-22 72 views
0

使用Django 1.5和Python 2.7和这些模型示例:创建参考模型一个Django模型Manager类

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    email = models.EmailField() 


class Showroom(models.Model): 
    name = models.CharField(max_length=100) 
    company = models.ForeignKey(Company) 

我怎么会去有关创建“公司”有一个默认的“展示厅”。我知道我可以在视图中做到这一点,例如。

company = models.Company(name=name, email=email) 
company.save() 
showroom = models.Showroom(name=name, company=company) 
showroom.save() 

,我试图用一个像经理:

class CompanyManager(models.Manager): 
    def create_company(self, name, email): 
     company = self.create(name=name, email=email) 
     company.save() # <-- DONT LIKE THIS LINE 
     user = User.objects.create_user(name, email, 'generated') 
     showroom = Showroom(name=name, company=company) 
     showroom.save() 
     return company 

我可以使用未保存的公司创造我的陈列室?如果不是,我需要保存它,但是这违反了管理员返回未保存实例的惯例(或者我错了吗?)。

有人可以推荐一个策略吗?

谢谢!

回答

1

我怎么会去有关创建“公司”使用默认的“陈列室?

覆盖保存模型公司的方法或注册后节省模型公司的信号。

我可以使用未保存公司创建我的陈列室

更新:

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    email = models.EmailField() 

    def save(*args, **kwargs): 
     super(Company, self).save(*args, **kwargs) 
     self.showroom__set.create(name=self.name) 

通过Berdus更新:

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    email = models.EmailField() 

    def save(self, *args, **kwargs): 
    is_first_save = self.pk is None 
    super(Company, self).save(*args, **kwargs) 
    if is_first_save: 
     self.showroom_set.create(name=self.name) 

注意在保存自我论证和showroom_set单下划线。

+0

谢谢你,小的调整后,此解决方案......更新了我使用的代码答案。 – Berdus

0

这是我想到的。

setting.py

DEFAULT_SHOWROOM_NAME = 'blah' 

models.py

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    email = models.EmailField() 

    def save(*args, **kwargs): 
     super(Company, self).save(*args, **kwargs) 
     if not self.showroom__set.all(): 
      self.showroom__set.create(name=DEFAULT_SHOWROOM_NAME) 
+1

我更新了我的答案,您不需要额外查询(self.showroom__set.all()) –