查询用户配置文件模型

Querying a User Profile model

我在查询时遇到问题。

用户申请

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    current_story = models.PositiveSmallIntegerField(null=True)
           return f'{self.user.username} Profile'

为了避免混淆,一旦我学会了如何跨应用程序使用外键,'current_story' 最终将成为 Books.story 模型(此处排除)的外键.

书籍申请

models.py

class character(models.Model):

    fk_user = models.ForeignKey(User, default='1', on_delete=models.CASCADE)
    fk_story = models.ForeignKey(story, default='1', on_delete=models.CASCADE)
    name = models.CharField(max_length=100, default='', null=True)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('name', )

views.py

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from users.models import Profile
from .models import (character)

class listof_characters(LoginRequiredMixin, ListView):
    model = character
    template_name = '/list_characters.html'
    context_object_name = 'characters'
    ordering = ['name']

    def get_queryset(self):
        ?

这就是我卡住的地方。我需要 character.fk_story = User.profile.current_story.

我不知道如何表达这个查询,我根据其他答案尝试了几种不同的方法,我也尝试了 User.current_story、User.userprofile.current_story。

我只需要按 当前 用户的 'current_story' 值过滤字符列表。

尝试使用这个:

fk_story = Profile.objects.filter(owner=request.user).order_by('current_story')

按照 Lars 所说的进行操作,但使用 self.request.user 而不是 request.user

更新

urls.py

urlpatterns = [
    # other urls
    path('characters/<int:pk>/', views.CharactersView.as_view(), name='characters'),
]

views.py

class CharactersView(LoginRequiredMixin, DetailView)
    model = story
    template_name = '/list_characters.html'

    def get_queryset(self):
        story = story.objects.get(pk=self.kwargs['pk']) # you need to pass a pk of the story you need the characters for in your url
        characters = character.objects.filter(fk_story=story)
        return characters

(这里我用DetailView替换了ListView所以我们可以通过story模型查询)

然后在您的模板中:

{% for character in characters %}
    {{ character.name }}
{% endfor %}

P.S。始终以大写字母开头模型名称和 ClassBasedViews 以提高可读性

    def get_queryset(self):
        profile = Profile.objects.get(user=self.request.user)

        # or better use
        # profile = get_object_or_404(Profile, user=self.request.user)

        queryset = character.objects.filter(fk_story =profile.current_story)
        return queryset

为了使其正常工作,您还需要更改您的配置文件模型。

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    current_story = models.ForeignKey(story, on_delete=models.CASCADE)
           return f'{self.user.username} Profile'

注意这里我使用的是外键而不是整数字段。