Как убедиться, что только один BooleanField верен для одной модели? - PullRequest
0 голосов
/ 04 мая 2019

У меня есть проект django, в котором у меня есть модель Videos. На моей странице шаблона индекса я хочу показать только одно видео, для которого isFeatured равно true. Всякий раз, когда я изменяю свойство isFeatured другого видео на true, оно должно сделать это свойство ложным для предыдущего видео.

Я проверил другие вопросы об стеке потока по этому поводу, но все они имеют дело с внешним ключом, в то время как моя модель проще, и я думаю, что есть более простое решение для этого.

Вот так выглядит моя модель:

class Video(models.Model):
    url = models.URLField(max_length=200)
    isFeatured = models.BooleanField(default=False)

    def __str__(self):
        return self.url

Ответы [ 4 ]

1 голос
/ 04 мая 2019
class Video(models.Model):
    url = models.URLField(max_length=200)
    isFeatured = models.BooleanField(default=False)

    def mark_featured(self):
        self.objects.all().update(isFeatured=False)
        self.isFeatured = True
        return self.save()

    def __str__(self):
        return self.url

Использовать как

video = Video.objects.get(...)
video.mark_featured()
1 голос
/ 04 мая 2019

Если вы действительно не хотите или не можете создать другую модель, то единственное решение для вас - обработать это с помощью кодов.

Единственный способ обойти это - изменить строки с помощью кода.

И чтобы сделать это правильно, создайте функцию, которая делает это, и используйте ее везде вместо того, чтобы переписывать код, чтобы избежать ошибок.

video_isfeatured_changer(video_id):
    # Change isFeatured for other featured videos to False.
    featured_videos = Video.objects.filter(isFeatured=True).update(isFeatured=False)

    video = Video.objects.get(pk=video_id)
    video.isFeatured = True
    video.save()

Вы также можете переопределить метод save() для модели Video.

0 голосов
/ 04 мая 2019

Спасибо за помощь.Мне удалось решить проблему, переопределив метод сохранения:

class Video(models.Model):
    url = models.URLField(max_length=200)
    isFeatured = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if self.isFeatured == True:
            Video.objects.filter(isFeatured=True).update(isFeatured=False)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.url

Я подожду немного, пока не одобрю этот ответ, так как я не очень знаком с django, поэтому не знаю, какие проблемыэто может или не может быть причиной.

0 голосов
/ 04 мая 2019

Первое видео с isFeatured = True

class Video(models.Model):
    url = models.URLField(max_length=200)
    isFeatured = models.BooleanField(default=False)

    def __str__(self):
       return self.url

    def homeheader(self):
       return self.filter(isFeatured=True).first()

Вы можете использовать по шаблону как:

{{ videos.homeheader }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...