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

问题描述 投票:0回答:2

我的模型中有以下内容:

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
python django django-models
2个回答
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/


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或任何其他请求值,因为该模型实际上不使用请求。这通常是通过表格完成的。

© www.soinside.com 2019 - 2024. All rights reserved.