如何在达到end_time时自动将状态字段从1更改为0
这是我的拍卖模型:
class Auction(models.Model):
auction_id = models.AutoField(primary_key=True)
crop = models.ForeignKey(Crop, on_delete=models.CASCADE)
image = models.ImageField(upload_to="crop-image")
farmer = models.ForeignKey(User, on_delete=models.CASCADE, limit_choices_to={'user_type': 'farmer'})
creation_time = models.DateTimeField(auto_now_add=True)
end_date = models.DateField()
end_time = models.TimeField()
status = models.BooleanField(default=True)
qty = models.IntegerField()
unit = models.CharField(max_length=10, choices=[('kg', 'Kilograms'), ('tonne', 'Metric Tons'), ('bushel', 'Bushels'), ('crate', 'Crates')])
hammer_price = models.IntegerField()
description = models.CharField(max_length=200)
payment = models.BooleanField(default=False)
class Meta:
verbose_name_plural = "Auctions"
def __str__(self):
return self.crop.title
当结束日期和结束时间到达时,拍卖的状态(在创建拍卖时默认设置为1)应该改为0。
1 个回答
4
我建议不要添加一个状态字段,而是检查结束时间戳是否被使用。因为定义一个status
字段会导致数据重复,也就是你在两次说明同样的事情。
你可能还应该把日期和时间结合起来,因为时间戳不仅仅是日期和时间,还涉及到夏令时等因素。
from django.conf import settings
class Auction(models.Model):
auction_id = models.AutoField(primary_key=True)
crop = models.ForeignKey(Crop, on_delete=models.CASCADE)
image = models.ImageField(upload_to='crop-image')
farmer = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
limit_choices_to={'user_type': 'farmer'},
)
creation_time = models.DateTimeField(auto_now_add=True)
end_timestamp = models.DateTimeField()
# no status
qty = models.IntegerField()
unit = models.CharField(
max_length=10,
choices=[
('kg', 'Kilograms'),
('tonne', 'Metric Tons'),
('bushel', 'Bushels'),
('crate', 'Crates'),
],
)
hammer_price = models.IntegerField()
description = models.CharField(max_length=200)
payment = models.BooleanField(default=False)
class Meta:
verbose_name_plural = 'Auctions'
def __str__(self):
return self.crop.title
比如,我们可以通过以下方式获取所有仍然活跃的Auction
:
from django.db.models.functions import Now
Auction.objects.filter(end_timestamp__gte=Now())
这样,我们就以一种被动的方式来确定状态,这通常比某个主动改变状态的过程更可靠。
我们可以通过在上面设置一个db_index=True
[Django-doc]来提高性能。
注意: 通常来说,使用
settings.AUTH_USER_MODEL
[Django-doc]来引用用户模型会比直接使用User
模型 [Django-doc]更好。想了解更多信息,可以查看文档中关于User
模型的引用部分 [Django-doc]。