在Django中引用模型方法中的用户对象

时间:2018-01-20 12:01:59

标签: python django django-models

我的模型中有以下内容:

class Genre(models.Model):
    name = models.CharField(max_length=100)
    def my_latest_song(self):
        song = Song.objects.filter(genre_id=self.id, author_id=XXXXXXXXX).order_by('-date')
        return song[0];

class Song(models.Model):
    name = models.CharField(max_length=100)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE, null=True)
    date = models.DateField()
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

因此,使用my_latest_song方法,我希望为每个类型获取当前登录用户的最新歌曲 。注意:我已经确定用户必须登录才能看到这一点,不要担心这个额外的验证。

问题是:如何将当前登录的用户的用户ID传递给此模型方法?列出XXXXXXXXXX的位置我尝试过:

  • AUTHOR_ID = request.user.id
  • AUTHOR_ID = user.id
  • 作者= request.user
  • 作者=用户

还有很多类似的选择。但我是Django的新手,并且不确定如何正确引用它。什么都没有用。

请注意:问题是我经常(在许多不同的视图中)显示每种类型的最新歌曲。这就是为什么我认为它在模型中有意义。它没有存储在数据库中,只是在模型中检索。如果这不合适,请告诉我。

例如,在很多页面上,我显示了一个流派列表,并为每个流派显示该用户上传的最新歌曲:

Genre   | Last Song
----------------------
Pop     | Song 1
Rock    | Song 33
Classic | Song 32

2 个答案:

答案 0 :(得分:1)

您不应该在模型中进行此查询。在需要信息时,最好在views.py中进行查询。

下面是,如果我理解正确,您需要做什么才能在视图中进行此查询。

def relevant_view(request,genreID_from_url):
    # ... #
    song = Song.objects.filter(author=request.user).filter(genre=genreID_from_url).order_by('-date')[:1]
    # ... #

有几点:

  • 我认为你需要传递你在URL中查询的类型。这是一个很好的教程:http://django-book.readthedocs.io/en/latest/chapter03.html#your-third-view-dynamic-urls。您也可以使用表单来完成 - 这取决于需要进行查询的环境。
  • 您需要按照' -date'而不是' date'这样你就可以在查询开始时收到最新的歌曲。
  • 最后的[]是Django用于限制查询集的语法。以上内容仅限于查询集的第一项,正如您尝试的那样。

Django文档中的查询页面非常有用且清晰:https://docs.djangoproject.com/en/2.0/topics/db/queries/

答案 1 :(得分:0)

这样的事可能吗?

...
def my_latest_song(self, user_id):
    song = Song.objects.filter(genre_id=self.id, author=User.objects.get(pk=user_id)).order_by('date')
    return song[0];
...

您将无法在该方法中使用request.user.id或任何其他请求值,因为该模型实际上并未使用请求。这通常是通过表格完成的。