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

时间:2015-10-29 05:46:55

标签: 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)        

我创建了一个自定义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_createget_or_create生成预期的CarProfile实例?

似乎这两种方法都是从create()类调用QuerySet而不是我的自定义类。

3 个答案:

答案 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_createget_or_create方法以及create以影响他们的行为。

答案 2 :(得分:0)

仅想澄清一下此问题已在Django v1.8a1中解决。因此,get_or_createupdate_or_create现在都将按预期方式调用管理器create方法。

https://github.com/django/django/commit/0dce44e16be2d4850120cd333380ab9171c5964a