Запрос модели профиля пользователя

У меня проблемы с этим запросом.

Приложение пользователей

модели.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 текущего пользователя.

Я все еще учусь, поэтому, пожалуйста, не обращайте внимания на мое невежество, но если я напишу «request.user.profile.current_story», где я поставил ? (т.е. последняя строка) - я получаю сообщение об ошибке, что «Запрос» является неопределенным термином. Если я изменю его на «self.request.user.profile.current_story», я получу ошибку атрибута «Профиль» не имеет атрибута «current_story»

Game Analysis 13.12.2020 16:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
506
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте использовать это:

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

Спасибо за ответ, я попытался разместить это там, где я поставил вопросительный знак в своем вопросе (ниже «def get_queryset (self):»), но мне дали NameError «имя« запрос »не определено».

Game Analysis 13.12.2020 16:09

Поместите запрос после LoginRequireMixin,ListView. Подобно классу listof_characters(LoginRequiredMixin, ListView, request):. Надеюсь, это решит вашу проблему.

Lars 14.12.2020 11:55

И вы также можете использовать default = ' ' :- fk_user = models.ForeignKey(User, default='', on_delete=models.CASCADE)

Lars 14.12.2020 11:59

Хотя другое решение в конечном итоге сработало, я попробую это, чтобы увидеть, работает ли это, и я смогу лучше понять проблему. Спасибо за помощь.

Game Analysis 14.12.2020 14:32

Делайте то, что сказал Ларс, но используйте 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 с прописными буквами для лучшей читабельности.

Спасибо, после изменения его в соответствии с вашим предложением я получаю сообщение об ошибке «Не удается разрешить ключевое слово« владелец »в поле. Возможные варианты: «, затем он перечисляет поля модели профиля.

Game Analysis 13.12.2020 19:51

Я обновил свой ответ, это должно дать вам результат, который вы ищете

SLDem 13.12.2020 20:21

Спасибо за обновление, оно дает мне KeyError, а simpy говорит «pk» (я думаю, повторяя, что такое скобки после .kwargs). Усложняет ли тот факт, что представление представляет собой список?

Game Analysis 13.12.2020 20:33

Я снова обновил ответ, теперь он должен работать :)

SLDem 13.12.2020 20:43

Выдает ту же ошибку, но приведенное ниже решение сработало. Всем спасибо за помощь, приму к сведению ваш совет.

Game Analysis 14.12.2020 14:30
Ответ принят как подходящий
    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'.

Game Analysis 13.12.2020 19:49

Спасибо, я попробовал новое предложение и получил сообщение об ошибке «Объект 'QuerySet' не имеет атрибута 'current_story'».

Game Analysis 13.12.2020 20:36

извини. используйте get, а не filter

ha-neul 13.12.2020 20:37

новая ошибка "столбец users_profile.current_story_id не существует СТРОКА 1: ...sers_profile"."user_id", "users_profile"."image", "users_pro... ^ СОВЕТ: Возможно, вы имели в виду ссылку на столбец "users_profile.current_story "." - Я также попытался добавить ".id", но это не изменило ошибку.

Game Analysis 13.12.2020 20:53

Вы мигрировали после того, как изменили модель profile, как я предложил?

ha-neul 13.12.2020 20:56

также могу я спросить, почему ваше поле внешнего ключа имеет значение по умолчанию = "1"? не могли бы вы их удалить?

ha-neul 13.12.2020 20:58

Спасибо, я не делал миграции после изменения поля на FK, теперь все работает.

Game Analysis 14.12.2020 14:29

Вы также, вероятно, захотите установить каждую историю, созданную пользователем, как текущую, и когда он удалит последнюю, установите новую последнюю :)

SLDem 14.12.2020 14:35

Другие вопросы по теме