Как автоматически изменить поле статуса с 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.

Я бы просто не добавил статус, но проверил, используется ли временная метка окончания. Определяя поле status, вы вводите дублирование данных, вы указываете одно и то же дважды.

Вероятно, вам также следует комбинировать дату и время, поскольку временная метка больше, чем дата и время, например, из-за перехода на летнее время<<<4>>

>
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] на него.


Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation [Django-doc].

Вернуться на верх