.update_or_create()不使用Django 1.8自定义管理器和.create()方法

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类而不是自定义类.

Nat*_*usa 4

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)