我有两个应该始终一起创建的相关实例。 我想在不使用信号的情况下执行此操作或覆盖模型的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时,在这两种情况下都会创建Car实例,但不会创建相应的CarProfile。
当我在自定义create() method
中指定了该行为时,为什么不会update_or_create
和get_or_create
生成预期的CarProfile实例?
似乎这两种方法都是从create()
类调用QuerySet
而不是我的自定义类。
答案 0 :(得分:3)
Django的Manager
课程实际上是QuerySet
Manager
create
。如果您在QuerySet
上实施Manager
,然后从中构建class CarQuerySet(models.QuerySet):
def create(self, **kwargs):
with transaction.atomic():
car = self.model(**kwargs)
car.save(force_insert=True)
CarProfile.objects.create(car=car)
return car
该怎么办?
Car
然后class Car(models.Mode):
make = models.CharField(max_length=32)
model = models.CharField(max_length=32)
class Meta:
unique_together = ('make', 'model',)
objects = CarQuerySet.as_manager()
是:
Ajax.ActionLink()
答案 1 :(得分:2)
覆盖create
在此实例中无效的实际原因是您需要覆盖update_and_create
和get_or_create
方法以及create
以影响他们的行为。
答案 2 :(得分:0)
仅想澄清一下此问题已在Django v1.8a1中解决。因此,get_or_create
和update_or_create
现在都将按预期方式调用管理器create
方法。
https://github.com/django/django/commit/0dce44e16be2d4850120cd333380ab9171c5964a