Naimur: I am - that SQL was in response to  Aldian's question :)

On Fri, Apr 12, 2019 at 8:23 PM naimur rahman <[email protected]>
wrote:

> use ORM istead of SQL
>
> On Fri, Apr 12, 2019, 7:42 PM Michael Thomas <
> [email protected]> wrote:
>
>> SELECT
>>     "app_foo"."id",
>>     "app_foo"."name"
>> FROM "app_foo"
>> INNER JOIN "app_bar" ON (
>>     "app_foo"."id" = "app_bar"."foo_id"
>> )
>> WHERE (
>>     NOT (
>>         "app_foo"."id" IN (
>>             SELECT
>>                 U1."foo_id"
>>             FROM "app_bar" U1
>>             WHERE U1."attribute_1" = 1
>>         )
>>     )
>>     AND "app_bar"."attribute_2" = 2
>> )
>>
>> On Fri, Apr 12, 2019 at 6:59 PM Aldian Fazrihady <[email protected]>
>> wrote:
>>
>>> What's the result of
>>>
>>> print(Foo.objects.exclude(bar__attribute=1).filter(
>>> bar__attribute_2=2).query)
>>>
>>> On Fri, 12 Apr 2019, 20:10 Michael Thomas, <
>>> [email protected]> wrote:
>>>
>>>> Hello everyone,
>>>>
>>>> I've run into what I believe is a limitation of the ORM that other
>>>> people must be dealing with somehow, but I can't seem to figure out a
>>>> sensible solution.
>>>>
>>>> I think it's easiest to describe the problem with code.
>>>>
>>>> For the following models:
>>>>
>>>> class Foo(models.Model):
>>>>     name = models.CharField(max_length=64)
>>>>
>>>>
>>>> class Bar(models.Model):
>>>>     foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
>>>>     attribute_1 = models.IntegerField()
>>>>     attribute_2 = models.IntegerField()
>>>>
>>>> I want to select all Foo() that have 1 or more bar with attribute_1 not
>>>> equal to 1, and attribute_2 equal to 2.
>>>>
>>>> Eg. SQL something like this:
>>>>
>>>> SELECT
>>>>     "app_foo"."id",
>>>>     "app_foo"."name"
>>>> FROM "app_foo"
>>>> INNER JOIN "app_bar" ON (
>>>>     "app_foo"."id" = "app_bar"."foo_id"
>>>> )
>>>> WHERE (
>>>>     "app_bar"."attribute_1" <> 1
>>>>     AND "app_bar"."attribute_2" = 2
>>>> )
>>>>
>>>> However, here's what I end up with...
>>>>
>>>>
>>>> print(Foo.objects.exclude(bar__attribute_1=1).filter(bar__attribute_2=2).query)
>>>> SELECT
>>>>     "app_foo"."id",
>>>>     "app_foo"."name"
>>>> FROM "app_foo"
>>>> INNER JOIN "app_bar" ON (
>>>>     "app_foo"."id" = "app_bar"."foo_id"
>>>> )
>>>> WHERE (
>>>>     NOT (
>>>>         "app_foo"."id" IN (
>>>>             SELECT
>>>>                 U1."foo_id"
>>>>             FROM "app_bar" U1
>>>>             WHERE U1."attribute_1" = 1
>>>>         )
>>>>     )
>>>>     AND "app_bar"."attribute_2" = 2
>>>> )
>>>>
>>>> print(Foo.objects.filter(~Q(bar__attribute_1=1),
>>>> bar__attribute_2=2).query)
>>>> Exact same SQL output as above
>>>>
>>>> Interestingly enough, a simple query for attribute_1=1 and
>>>> attribute_2=2 works as expected, so it would be trivial to do this with a
>>>> __ne operator (if it existed), without any other changes to the ORM:
>>>>
>>>> print(Foo.objects.filter(bar__attribute_1=1, bar__attribute_2=2).query)
>>>> SELECT
>>>>     "app_foo"."id",
>>>>     "app_foo"."name"
>>>> FROM "app_foo"
>>>> INNER JOIN "app_bar" ON (
>>>>     "app_foo"."id" = "app_bar"."foo_id"
>>>> )
>>>> WHERE (
>>>>     "app_bar"."attribute_1" = 1
>>>>     AND "app_bar"."attribute_2" = 2
>>>> )
>>>>
>>>> Am I missing something here? How are other people tackling this?
>>>>
>>>> Kind Regards,
>>>> Michael Thomas
>>>>
>>>> --
>>>> 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 [email protected].
>>>> To post to this group, send email to [email protected].
>>>> Visit this group at https://groups.google.com/group/django-users.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/django-users/d852fc10-5f5a-43e8-8dab-c796404867a8%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/django-users/d852fc10-5f5a-43e8-8dab-c796404867a8%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> --
>>> 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 [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at https://groups.google.com/group/django-users.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/django-users/CAN7EoAaXupYqNoPcHOcZ3OoA_07N--D4EPoEfZvkSWL%2BeLbD6A%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/django-users/CAN7EoAaXupYqNoPcHOcZ3OoA_07N--D4EPoEfZvkSWL%2BeLbD6A%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
>> 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 [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/django-users.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/django-users/CAEdx1fpYmYHXX14iu3Enwc18Ojkk3%3DBfzTv3mGWVdf5BzZVv7w%40mail.gmail.com
>> <https://groups.google.com/d/msgid/django-users/CAEdx1fpYmYHXX14iu3Enwc18Ojkk3%3DBfzTv3mGWVdf5BzZVv7w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
> --
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/CAENN6BLoBbu8v_BTDaPYyaQ1AJzQGi2E9t1trg_9PwbzP-Rn3A%40mail.gmail.com
> <https://groups.google.com/d/msgid/django-users/CAENN6BLoBbu8v_BTDaPYyaQ1AJzQGi2E9t1trg_9PwbzP-Rn3A%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAEdx1fqO1toFaB5qS6cduAJ5Hhmm6ybOjyCPvtQmy-RHBKWjGg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to