1
0
mirror of https://github.com/django/django.git synced 2025-05-17 04:16:27 +00:00

Fixed #36326 -- Added CompositePrimaryKey support in QuerySet.raw().

Signed-off-by: SaJH <wogur981208@gmail.com>
This commit is contained in:
SaJH 2025-04-15 03:06:49 +09:00 committed by Sarah Boyce
parent d755a98b84
commit 1831f7733d
3 changed files with 21 additions and 2 deletions

View File

@ -165,7 +165,9 @@ class RawModelIterable(BaseIterable):
annotation_fields, annotation_fields,
) = self.queryset.resolve_model_init_order() ) = self.queryset.resolve_model_init_order()
model_cls = self.queryset.model model_cls = self.queryset.model
if model_cls._meta.pk.attname not in model_init_names: if any(
f.attname not in model_init_names for f in model_cls._meta.pk_fields
):
raise exceptions.FieldDoesNotExist( raise exceptions.FieldDoesNotExist(
"Raw query must include the primary key" "Raw query must include the primary key"
) )

View File

@ -201,6 +201,9 @@ Models
:ref:`a forced update <ref-models-force-insert>` results in no affected rows, :ref:`a forced update <ref-models-force-insert>` results in no affected rows,
instead of a generic :exc:`django.db.DatabaseError`. instead of a generic :exc:`django.db.DatabaseError`.
* :meth:`.QuerySet.raw` now supports models with a
:class:`~django.db.models.CompositePrimaryKey`.
Pagination Pagination
~~~~~~~~~~ ~~~~~~~~~~

View File

@ -11,7 +11,7 @@ except ImportError:
from django import forms from django import forms
from django.core import serializers from django.core import serializers
from django.core.exceptions import FieldError from django.core.exceptions import FieldDoesNotExist, FieldError
from django.db import IntegrityError, connection from django.db import IntegrityError, connection
from django.db.models import CompositePrimaryKey from django.db.models import CompositePrimaryKey
from django.forms import modelform_factory from django.forms import modelform_factory
@ -158,6 +158,20 @@ class CompositePKTests(TestCase):
users = User.objects.values_list("pk").order_by("pk") users = User.objects.values_list("pk").order_by("pk")
self.assertNotIn('AS "pk"', str(users.query)) self.assertNotIn('AS "pk"', str(users.query))
def test_raw(self):
users = User.objects.raw("SELECT * FROM composite_pk_user")
self.assertEqual(len(users), 1)
user = users[0]
self.assertEqual(user.tenant_id, self.user.tenant_id)
self.assertEqual(user.id, self.user.id)
self.assertEqual(user.email, self.user.email)
def test_raw_missing_PK_fields(self):
query = "SELECT tenant_id, email FROM composite_pk_user"
msg = "Raw query must include the primary key"
with self.assertRaisesMessage(FieldDoesNotExist, msg):
list(User.objects.raw(query))
def test_only(self): def test_only(self):
users = User.objects.only("pk") users = User.objects.only("pk")
self.assertSequenceEqual(users, (self.user,)) self.assertSequenceEqual(users, (self.user,))