Hi everyone,

I just updated a project to 4.1, and a query stopped working. I tested with 
both SQLite and PostgreSQL, and i got the same result. I'm not 100% sure 
this is bug in Django 4.1, but it works fine on 4.0.7.

These are the models and the manager related to the query:

class PostManager(models.Manager):
    def request_data(self, request_user):
        liked_by_user = Value(False)
        is_following = Value(False)
        is_owner = Case(When(user__id=request_user.id, then=True), default
=False)

        if request_user.is_authenticated:
            # Check if the user has liked the post in each row of the query
            liked_by_user = Exists(request_user.liked_posts.filter(id
=OuterRef("id")))
            is_following = Exists(request_user.following.filter(id
=OuterRef("user__id")))

        return is_owner, liked_by_user, is_following

    def fetch_all_posts(self, request_user) -> QuerySet[Post]:
        is_owner, liked_by_user, is_following = self
.request_data(request_user)

        return (
            self.select_related()
            .prefetch_related(
                Prefetch(
                    "comments",
                    queryset=Comment.objects.select_related().filter(reply
=False),
                ),  # filter related "comments" inside the post QuerySet
            )
            .order_by("-publication_date")
            .annotate(is_following=is_following)
            .annotate(is_owner=is_owner)
            .annotate(likes=Count("liked_by"))
            .annotate(liked_by_user=liked_by_user)
        )

    def fetch_following_posts(self, request_user: User) -> QuerySet[Post]:
        return self.fetch_all_posts(request_user).filter(user__in
=request_user.following.all())

class User(AbstractUser):
    id: int
    posts: RelatedManager[Post]
    liked_posts: RelatedManager[Post]
    comments: RelatedManager[Comment]

    about = models.CharField(blank=True, max_length=255)
    photo = models.ImageField(
        blank=True,
        upload_to=upload_path,
        validators=[file_validator],
    )

    following = models.ManyToManyField("self", related_name="followers", 
symmetrical=False)

    objects: CustomUserManager = CustomUserManager()

class Post(models.Model):
    id: int
    user_id: int
    comments: RelatedManager[Comment]

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name
="posts"
    )
    text = models.CharField(max_length=200)
    publication_date = models.DateTimeField(auto_now_add=True)
    edited = models.BooleanField(default=False)
    last_modified = models.DateTimeField(auto_now_add=True)
    liked_by = models.ManyToManyField(
        settings.AUTH_USER_MODEL, related_name="liked_posts", blank=True
    )

    objects: PostManager = PostManager()

The query raising the exception:
posts = Post.objects.fetch_all_posts(request_user=request.user)

Traceback:
 File "/home/fernando/Workspaces/CS50 
Web/project4/network/network/api_views.py", line 198, in get_all_posts
    if posts is None or posts.exists() is False:
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/models/query.py",
 
line 1225, in exists
    return self.query.has_results(using=self.db)
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/models/sql/query.py",
 
line 592, in has_results
    return compiler.has_results()
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/models/sql/compiler.py",
 
line 1363, in has_results
    return bool(self.execute_sql(SINGLE))
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/models/sql/compiler.py",
 
line 1395, in execute_sql
    cursor.execute(sql, params)
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/backends/utils.py",
 
line 103, in execute
    return super().execute(sql, params)
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/backends/utils.py",
 
line 67, in execute
    return self._execute_with_wrappers(
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/backends/utils.py",
 
line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/backends/utils.py",
 
line 84, in _execute
    with self.db.wrap_database_errors:
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/utils.py", 
line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/backends/utils.py",
 
line 89, in _execute
    return self.cursor.execute(sql, params)
  File "/home/fernando/Workspaces/CS50 
Web/project4/network/.venv/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py",
 
line 357, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: sub-select returns 13 columns - expected 1

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/14ac8485-d95c-4d74-95f5-a536bfa66dbdn%40googlegroups.com.

Reply via email to