Как отфильтровать по BooleanField в Django? - PullRequest
0 голосов
/ 09 октября 2019

Мне было трудно выполнить эту задачу, и мне кажется, что я не могу получить помощь, куда бы я ни повернулся. Я пытаюсь отправить Memo s конкретному пользователю group s в Django. Каждый пользователь в каждом group должен получить Memo и иметь возможность изменить BooleanField на True, чтобы показать, что он его прочитал.

Затем мне нужно будет получить доступ к количеству пользователей, которые получили и пометили BoolenField как True, чтобы я мог создать таблицу в шаблоне с надписью [3/31 Read] и т. Д. .

Я бы не хотел использовать GenericForeignkey s, если это возможно, и я хотел бы сохранить его как одну модель, если это возможно, но я знаю, что это может не сработать. В настоящее время я пытался это сделать:

class Memo(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_time = models.DateTimeField(default=timezone.now)
    sender = models.ForeignKey(User, on_delete=models.CASCADE)
    receiver = models.ManyToManyField(Group)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('memos-detail', kwargs={'pk': self.pk})

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

class ReceivedMemo(models.Model):
    memo = models.ForeignKey(
        Memo, related_name='user_memos', on_delete=models.CASCADE)
    receiver = models.ForeignKey(
        User, related_name='memos', on_delete=models.CASCADE)
    read = models.BooleanField(default=False)

Затем я попытался отфильтровать ReceivedMemos по memo, чтобы увидеть, есть ли у каждого receiver памятка read или нет. Но это становится все сложнее, и я не уверен, будет ли это работать. Я иду об этом правильным путем? Или я должен иметь возможность иметь одну модель, такую ​​как:

class Memo(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_time = models.DateTimeField(default=timezone.now)
    sender = models.ForeignKey(User, on_delete=models.CASCADE)
    receiver = models.ForeignKey(User, on_delete=models.CASCADE)
    read = models.BooleanField(default=True)

Кажется, что к каждому объекту будет применяться BooleanField к объекту, а не к пользователю.

1 Ответ

1 голос
/ 09 октября 2019

Модель ReceivedMemo кажется более подходящей, чем бит read, но проблема с этим подходом заключается в том, что всякий раз, когда вы создаете новый Memo, вам также необходимо создавать много (для каждого User вGroup) ReceivedMemo объектов с read=False? Это кажется бессмысленным. Может быть, вы можете просто сохранить пользователей, которые на самом деле читают эту вещь, и для всех, кто остался, подумайте, что он ее не читал. Т.е.

class Memo(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_time = models.DateTimeField(default=timezone.now)
    sender = models.ForeignKey(User, on_delete=models.CASCADE)
    receiver = models.ManyToManyField(Group)

    read_by = models.ManyToManyField(User)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...