Django将模型外键默认值应用于现有记录

时间:2017-06-06 10:16:37

标签: python django

非常感谢您抽出宝贵时间。

以前,我发布了这个问题,How to Get Unread Posts for Users

问题是:在本文已被其他用户阅读时,我无法过滤掉一个用户尚未阅读的文章。

我想出了为什么我不能这样做----因为我有数据写入数据库而不使用Django虽然我将每个帖子的读取默认设置为False ----根本就没有记录。

然后,我手动将一篇文章设置为未读给管理员中的用户,一切正常,因为现在在数据库中有一条记录表明该用户尚未阅读该特定文章。

现在的问题是:

如何为所有现有用户在数据库中为每个现有文章设置“未读”?

除非新用户真正阅读过,否则每个新用户的文章如何保持未读状态?

为方便起见,我将代码复制到此处。

我的模特:

class Posts(models.Model):
 title = models.CharField(max_length=255)
 content_url = models.URLField(unique=True)
 content = models.CharField(max_length=255)
 post_date = models.DateField(default="2999-12-12")

另一个

class readstatus(models.Model):
 reading_status = models.BooleanField(default=False)
 user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
 article = models.ForeignKey(Posts, on_delete=models.CASCADE)
 created = models.DateTimeField(auto_now_add=True)

我的观点:

class DailyReading(ListView):

 template_name = 'reading.html'
 context_object_name = "data" 
 paginate_by = 20
 def get_queryset(self):

    if self.kwargs['status'] == "read":
        queryset = piaoyou.objects.filter(readstatus__reading_status=True,readstatus__user=self.request.user)
        return queryset
    else:
        queryset= Posts.objects.filter(readstatus__reading_status=False,readstatus__user=self.request.user)
        return queryset

我的模板:

    {% for info in data %}
                <quoteblock>
                    <ul>
                        <li><a href="{{ info.get_absolute_url }}">{{ info.title }}
                            <footnote></footnote>
                        </a>{{ info.post_date }}</li>

                        <footnote>{{ info.get_abstract_content }}</footnote>
                    </ul>
                </quoteblock>

       {% endfor %}

1 个答案:

答案 0 :(得分:0)

OMG,我刚刚想出了如何做到这一点。

对于请求用户已读过的文章,我们只能传递queryset = Post.objects.filter(readstatus__reading_status = True,readstatus__user = self.request.user)

对于尚未被请求用户阅读的文章,我们可以将Posts.objects.all()传递到模板中。

然后在模板中:

我们需要{%if instance.readstatus_set.all%}这一行才能让事情发挥作用。假设没有关于此请求用户是否已阅读该文章的数据,该实例不应具有readstatus_set.all,这意味着用户尚未阅读该文章。一旦检查了这个条件,我们就可以检查循环中的其他条件。