0

使用 Django 1.5 和 Python 2.7 以及这些示例模型:

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

我可以使用未保存的公司来创建我的陈列室吗?如果没有,我需要保存它,但这违反了经理返回未保存实例的约定(或者我错了吗?)。

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

谢谢!

4

2 回答 2

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)

请注意 save 中的 self 参数和 showroom_set 上的单个下划线。

于 2013-06-22T07:24:08.833 回答
0

这就是我的想法。

设置.py

DEFAULT_SHOWROOM_NAME = 'blah'

模型.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)
于 2013-06-22T07:41:29.240 回答