Django在用户和所选文章之间添加关系

时间:2017-11-18 20:56:04

标签: python django django-models django-views

我有一个简单的模型文章。该模型是:

class Article(models.Model):
    title = models.CharField()
    text = models.TextField()
    likes = models.IntegerField(default=0)
    user = models.ForeignKey(User)

我也登录,并且喜欢,每个用户都有喜欢的文章。 我制作新模型:

class LikeArticle(models.Model):
    article = models.IntegerField()
    user = models.ForeignKey(User)

在视图中我们有

def articleLike(request):
    if request.method == 'POST':
        article_id = request.POST['id']
        article_like = LikeArticle(
           article=article_id,
           user=request.user
        )
        article_like.save()

当我们想看所有喜欢的文章时

def favorite(request):
    favorite_list = LikeArticle.objects.all()
    return render(request, 'article/favorite.html', {'articleList': favorite_list})

但现在它返回我的id文章和用户名,我如何过滤和选择 Article.objects.all()

我的逻辑是否正确? 也许我需要做一切不同的事情?

2 个答案:

答案 0 :(得分:0)

您需要通过外键链接LikeArticleArticle

class LikeArticle(models.Model):
    article = models.ForeignKey(Article)
    user = models.ForeignKey(User)

答案 1 :(得分:0)

将用户映射到文章的表具有article字段,该字段只是整数列,而不是外键。除了两个共享名称之外,它与您的文章表没有任何关系。

您正在做的事情被称为多对多关系,而Django实际上有一个名为ManyToManyField的特殊字段,可以为您管理中间表(因此您不必创建LikeArticle):

class Article(models.Model):
    title = models.CharField()
    text = models.TextField()
    likes = models.IntegerField(default=0)
    user = models.ForeignKey(User)

    favorited_by = models.ManyToManyField(User, related_name="favorite_articles")

现在,您可以这样做:

def favorite(request):
    favorite_list = request.user.favorite_articles.all()
    return render(request, 'article/favorite.html', {'articleList': favorite_list})

反向关系:Article.objects.get(id=123).favorited_by.all()