[英]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.