查询用户配置文件模型
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'
注意这里我使用的是外键而不是整数字段。
我在查询时遇到问题。
用户申请
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'
注意这里我使用的是外键而不是整数字段。