У меня проблемы с этим запросом.
Приложение пользователей
модели.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 (исключенной здесь), как только я узнаю, как использовать внешний ключ в приложениях.
Приложение «Книги»
модели.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', )
просмотры.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')
Спасибо за ответ, я попытался разместить это там, где я поставил вопросительный знак в своем вопросе (ниже «def get_queryset (self):»), но мне дали NameError «имя« запрос »не определено».
Поместите запрос после LoginRequireMixin,ListView. Подобно классу listof_characters(LoginRequiredMixin, ListView, request):. Надеюсь, это решит вашу проблему.
И вы также можете использовать default = ' ' :- fk_user = models.ForeignKey(User, default='', on_delete=models.CASCADE)
Хотя другое решение в конечном итоге сработало, я попробую это, чтобы увидеть, работает ли это, и я смогу лучше понять проблему. Спасибо за помощь.
Делайте то, что сказал Ларс, но используйте self.request.user
вместо request.user
ОБНОВЛЯТЬ
urls.py
urlpatterns = [
# other urls
path('characters/<int:pk>/', views.CharactersView.as_view(), name='characters'),
]
просмотры.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
(здесь я заменил ListView на DetailView, чтобы мы могли запрашивать модель story
)
затем в вашем шаблоне:
{% for character in characters %}
{{ character.name }}
{% endfor %}
P.S. Всегда начинайте имена моделей и ClassBasedView с прописными буквами для лучшей читабельности.
Спасибо, после изменения его в соответствии с вашим предложением я получаю сообщение об ошибке «Не удается разрешить ключевое слово« владелец »в поле. Возможные варианты: «, затем он перечисляет поля модели профиля.
Я обновил свой ответ, это должно дать вам результат, который вы ищете
Спасибо за обновление, оно дает мне KeyError, а simpy говорит «pk» (я думаю, повторяя, что такое скобки после .kwargs). Усложняет ли тот факт, что представление представляет собой список?
Я снова обновил ответ, теперь он должен работать :)
Выдает ту же ошибку, но приведенное ниже решение сработало. Всем спасибо за помощь, приму к сведению ваш совет.
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'
Обратите внимание, здесь я использую внешний ключ, а не целочисленное поле.
Спасибо, я сделал, как указано, но я получаю сообщение об ошибке «Объект 'listof_characters' не имеет атрибута 'fk_user'.
Спасибо, я попробовал новое предложение и получил сообщение об ошибке «Объект 'QuerySet' не имеет атрибута 'current_story'».
извини. используйте get
, а не filter
новая ошибка "столбец users_profile.current_story_id не существует СТРОКА 1: ...sers_profile"."user_id", "users_profile"."image", "users_pro... ^ СОВЕТ: Возможно, вы имели в виду ссылку на столбец "users_profile.current_story "." - Я также попытался добавить ".id", но это не изменило ошибку.
Вы мигрировали после того, как изменили модель profile
, как я предложил?
также могу я спросить, почему ваше поле внешнего ключа имеет значение по умолчанию = "1"? не могли бы вы их удалить?
Спасибо, я не делал миграции после изменения поля на FK, теперь все работает.
Вы также, вероятно, захотите установить каждую историю, созданную пользователем, как текущую, и когда он удалит последнюю, установите новую последнюю :)
Я все еще учусь, поэтому, пожалуйста, не обращайте внимания на мое невежество, но если я напишу «request.user.profile.current_story», где я поставил ? (т.е. последняя строка) - я получаю сообщение об ошибке, что «Запрос» является неопределенным термином. Если я изменю его на «self.request.user.profile.current_story», я получу ошибку атрибута «Профиль» не имеет атрибута «current_story»