簡體   English   中英

在Django中使用具有相同值的不同模型字段

[英]Use different model's field with the same value in Django

我有兩個Django模型,並且我想在兩個模型中都具有相同值的字段。 基本上,當CarModification.engine_status'inactive''active' ,我希望將Car中的相同字段設置為最新的CarModification的字段值。

class CarManager(models.Manager):

    def get_queryset(self):
        # Select engine_status from the latest
        # carmodification. If there are no modifications,
        # use default 'inactive'
        return super(CarManager, self).get_queryset().extra(
            select={
            'engine_status': "SELECT COALESCE ( "
                          "    (SELECT engine_status "
                          "    FROM carmodifications "
                          "    WHERE cars.id = carmodifications.car_id "
                          "    ORDER BY carmodifications.created_at DESC "
                          "    LIMIT 1), 'inactive')"
        )

class Car(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = CarManager()

class CarModification(models.Model):
    CHOICES = (
        ('active', 'Active')
        ('inactive', 'Inactive')
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    comment = models.CharField()
    engine_status = models.CharField(default='inactive', choices=CHOICES)
    car = models.ForeignKey(Car, related_name='modifications')

這可以正常工作,但我還希望能夠通過此額外字段過濾Car對象。 使用更多的SQL查詢是可能的,但是(我認為已經很丑)。 有沒有一種方法可以使用Django ORM完成相同但更簡潔的方法?

我認為您可以嘗試通過注釋而不是其他方法解決此問題。 注釋將允許您使用新創建的字段進行過濾。 更多信息: https : //docs.djangoproject.com/en/1.8/topics/db/aggregation/

順便說一句,因為似乎您始終需要在engine_status上使用engine_status 您為什么不只在Car模型上創建一個字段,並在每次創建CarModification時用信號設置其狀態?

我更喜歡在這種情況下使用signal

class Car(models.Model):
    engine_status =  models.CharField(max_length=256, default='inactive')


class CarModification(models.Model):
    CHOICES = (
        ('active', 'Active'),
        ('inactive', 'Inactive')
        )
    engine_status = models.CharField(max_length=256, default='inactive', choices=CHOICES)
    car = models.ForeignKey(Car, related_name='modifications')


@receiver(post_save, sender=CarModification)
def pre_save_handler(sender, **kwargs):
    """after saving CarModification, change car's engine_status"""
    instance = kwargs.get('instance')
    if instance.car_id:
        current_car = Car.objects.filter(id=instance.car_id)[0]
        current_car.engine_status = instance.engine_status
        current_car.save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM