#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
модели, как я предложил?