如何在达到end_time时自动将状态字段从1更改为0

1 投票
1 回答
37 浏览
提问于 2025-04-12 09:31

这是我的拍卖模型:

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]

撰写回答