laj*_*ong 8 django django-models django-1.8
我有两个相关的实例,应该始终一起创建.我想在不使用信号或覆盖模型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)
Run Code Online (Sandbox Code Playgroud)
我创建了一个自定义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
Run Code Online (Sandbox Code Playgroud)
当我调用时Car.objects.create(make='Audi', model='R8'),会按预期创建一个新的Car实例及其相应的CarProfile.但是,当我尝试使用Car.objects.update_or_create(make='Audi', model='R8')或创建新的Car时Car.objects.get_or_create(make='Audi', model='R8'),在这两种情况下都会创建Car实例,但不会创建相应的CarProfile.
为什么不update_or_create和get_or_create时,我指定的习俗,行为产生预期CarProfile实例create() method?
似乎这两种方法都是调用create()from QuerySet类而不是自定义类.
Django 的Manager类实际上是一个QuerySet已重构为Manager. 如果您create在 a 上实现QuerySet然后Manager从中构建 a 会怎样?
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
Run Code Online (Sandbox Code Playgroud)
那么就是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()
Run Code Online (Sandbox Code Playgroud)