使用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
我可以使用未保存的公司来创建我的陈列室吗?如果没有,我需要保存它,但这违反了管理器返回未保存实例的约定(或者我错了?)。
有人可以推荐一个策略吗?
谢谢!
答案 0 :(得分:1)
如何使用默认的“陈列室”创建“公司”?
覆盖model Company的保存方法或在model Company上注册保存信号。
我可以使用未保存的公司来创建我的陈列室吗?
没有
更新:
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上的单个下划线。
答案 1 :(得分: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)