Django: неподдерживаемый поиск «после» для CharField или join в поле не разрешен

#django #django-models #django-views #django-templates

#django #django-модели #django-просмотры #django-шаблоны

Вопрос:

Я пытаюсь создать систему отслеживания, когда я пытался позволить пользователям видеть сообщения пользователей, которые следуют за ними, я получил сообщение об ошибке Неподдерживаемый поиск «после» для CharField или join в поле не разрешено

Модель профилей

 class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username = models.CharField(max_length=30, unique=True)
    date_joined = models.DateTimeField(
        verbose_name="date joined", auto_now_add=True
    )
    following = models.ManyToManyField(
        settings.AUTH_USER_MODEL, blank=True, related_name="follow"
    )
 

Модель posts

 class Video(models.Model):
    author = models.ForeignKey(Account, on_delete=models.CASCADE)
    video = models.FileField(upload_to='post-videos')
    title = models.CharField(max_length=100)
    description = models.TextField(null=True, blank=True)
 

мое мнение

 class home_screen_view(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        logged_in_user = request.user
        post = Video.objects.filter(
            author__username__following__in=[logged_in_user.id]
        ).order_by('-created_date')
        context = {
            'post_list': post,
        }
        return render(request, "personal/home.html", context)
 

Ответ №1:

Ваш post = ... запрос неверен, потому что вы извлекаете имя автора username (которое существует), но затем обрабатываете его так, как если бы это поле было внешним ключом или m2m со следующим свойством, что совершенно неверно. имя пользователя — это CharField.

Вместо этого давайте попробуем прояснить концепции, которые будут полезны для создания нашего решения:

У каждого видео есть автор.

Каждый автор — это пользователь.

У каждого пользователя есть отношения m2m following , которые являются пользователями, за которыми он следит.

У каждого пользователя есть ОБРАТНАЯ связь follow m2m, то есть пользователи, которые следуют за ним.

Поэтому, по вашему мнению, ваш запрос должен быть:

     post = Video.objects.filter(
        author__follow=logged_in_user
    ).order_by('-created_date')
 

С django M2Ms, пока logged_in_user находится в этом списке, ...follow=logged_in_user вернет true и отфильтрует элемент.