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

#django #django-queryset

#django #django-набор запросов

Вопрос:

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

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

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

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.

Комментарии:

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

Ответ №1:

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

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

Комментарии:

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

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

3. И вы также можете использовать default = ‘ ‘ :- fk_user = models . ForeignKey(пользователь, по умолчанию =», on_delete=модели. КАСКАД)

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

Ответ №2:

Делайте то, что сказал Ларс, но используйте 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
 

(здесь я заменил ListView на DetailView, чтобы мы могли запрашивать по story модели)

затем в вашем шаблоне:

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

PS Всегда начинайте имена моделей и ClassBasedViews с прописных букв для лучшей читаемости

Комментарии:

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

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

3. Спасибо за обновление, оно выдает мне ошибку ключа, и simpy говорит «pk» (я думаю, повторяя, какие скобки после .kwargs). Является ли тот факт, что представление является listview, усложняет ситуацию?

4. Я снова обновил ответ, теперь он должен работать 🙂

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

Ответ №3:

     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'
 

Обратите внимание, что здесь я использую foreignkey, а не integerfield.

Комментарии:

1. Спасибо, я сделал, как указано, но я получаю сообщение об ошибке под названием «объект’listof_characters’ не имеет атрибута ‘fk_user’.

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

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

4. новая ошибка «столбец users_profile.current_story_id не существует СТРОКА 1: … sers_profile».»user_id», «users_profile».»изображение», «users_pro… ^ ПОДСКАЗКА: возможно, вы имели в виду ссылку на столбец «users_profile.current_story». » — Я также попытался добавить «.id», но это не изменило ошибку.

5. вы выполнили миграцию после изменения profile модели, как я предложил?