【发布时间】:2016-01-29 03:44:48
【问题描述】:
我有两个应该始终一起创建的相关实例。 我想在不使用信号或覆盖模型的save() 方法的情况下执行此操作。
class Car(models.Mode):
make = models.CharField(max_length=32)
model = models.CharField(max_length=32)
class Meta:
unique_together = ('make', 'model',)
objects = CarManager()
class CarProfile(models.Model):
car = models.OneToOneField(Car)
last_checkup = models.DateTimeField(blank=True, null=True)
我创建了一个自定义 CarManager,它覆盖了 models.Manager.create() 以确保在创建 Car 时创建 CarProfile:
class CarManager(models.Manager):
def create(self, **kwargs):
with transaction.atomic():
car = self.model(**kwargs)
car.save(force_insert=True)
CarProfile.objects.create(car=car)
return car
当我调用Car.objects.create(make='Audi', model='R8') 时,会按预期创建一个新的 Car 实例及其对应的 CarProfile。然而,当我尝试使用Car.objects.update_or_create(make='Audi', model='R8') 或Car.objects.get_or_create(make='Audi', model='R8') 创建一辆新车时,在这两种情况下都会创建一个 Car 实例,但没有创建相应的 CarProfile。
当我在自定义 create() method 中指定该行为时,为什么 update_or_create 和 get_or_create 不生成预期的 CarProfile 实例?
这两种方法似乎都是从QuerySet 类调用create() 而不是我自定义的。
【问题讨论】:
标签: django django-models django-1.8