Hello Adam,
my use case is:
-- because on post_save signal the F object is serialized, all fields have to
be fetched in advance, otherwise the serializer does a separate SQL for each
uncached field
-- listing explicitly the fields in defer/only clauses is not smart, as the
queries have to be updated every time the current or related model change
-- I want to have efficient SQL
Users expect from F.object.select_related('g__n') to fetch the n-field, it does
not matter if there is a number or JOIN-object behind 'n'.
https://docs.djangoproject.com/en/2.0/ref/models/querysets/ contains this
example:
Book.objects.select_related('author__hometown')
so if "hometown" is a separate model, the Queryset works as expected, but not
if it is a primitive field,
Besides, the syntax proposed by me has no other meaning currently and follows
the overall logic. (In fact, I was expecting that Django does it the way I
describe, because of the aforementioned example).
Regards
Дилян
On 01/26/18 19:05, Adam Johnson wrote:
F.objects.select_related('g__n') looks a bit convoluted to me.
You can already do something like F.objects.select_related('g').only('g__n', *[f.name
<http://f.name> for f in F._meta.get_fields()]) and write a small helper
function for the list comprehension to avoid typing.
Also I'd say it's generally a rare case that such an optimization is worth it,
so it's probably not useful to add ORM shortcut syntax for it.
On 26 January 2018 at 17:24, Дилян Палаузов <dpa-dja...@aegee.org
<mailto:dpa-dja...@aegee.org>> wrote:
Hello,
Provided:
class M(models.Model):
n = models.IntegerField()
r = models.IntegerField()
t = models.IntegerField()
s = models.IntegerField()
u = models.IntegerField()
class F(models.Model):
g = models.ForeignKey(M, on_delete=models.CASCADE)
a = models.IntegerField()
b = models.IntegerField()
c = models.IntegerField()
d = models.IntegerField()
e = models.IntegerField()
I want to obtain with a queryset all fields from F and M.n, but not the
other fields of M like M.r, so that a single SELECT is generated, that doesn't
pick unnecessary columns.
F.objects.select_related('g').defer('g__r', 'g__t', 'g__s', 'g__u') does
work, but I don't like it, as I want to say only M.n has to be obtained, and
not the others.
prefetch_related() is also suboptimal, as it creates two SQL queries
instead of one. only() does not let me specify 'All fields of F'.
So here neither only() nor defer() nor prefetch_related() are good.
F.objects.select_related('g__n') would fit from logic, but does not work
(django.core.exceptions.FieldError: Non-relational field given in
select_related: 'n'. Choices are: (none))
I propose teaching select_related() to accept the above expression.
Confer https://code.djangoproject.com/ticket/29072
<https://code.djangoproject.com/ticket/29072> .
Regards
Дилян
--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to django-developers+unsubscr...@googlegroups.com
<mailto:django-developers%2bunsubscr...@googlegroups.com>.
To post to this group, send email to django-developers@googlegroups.com
<mailto:django-developers@googlegroups.com>.
Visit this group at https://groups.google.com/group/django-developers
<https://groups.google.com/group/django-developers>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-developers/d9a58b37-d084-2efe-33b0-4cd9b8289796%40aegee.org
<https://groups.google.com/d/msgid/django-developers/d9a58b37-d084-2efe-33b0-4cd9b8289796%40aegee.org>.
For more options, visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.
--
Adam
--
You received this message because you are subscribed to the Google Groups "Django
developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to
django-developers+unsubscr...@googlegroups.com
<mailto:django-developers+unsubscr...@googlegroups.com>.
To post to this group, send email to django-developers@googlegroups.com
<mailto:django-developers@googlegroups.com>.
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-developers/CAMyDDM3bpJnz%2BPNux3XG0VEWJV0vMjqJ2ex_uQyU5nLL3wjS1A%40mail.gmail.com
<https://groups.google.com/d/msgid/django-developers/CAMyDDM3bpJnz%2BPNux3XG0VEWJV0vMjqJ2ex_uQyU5nLL3wjS1A%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
developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-developers/c9926c49-8b76-e969-2c72-b02796471f3f%40aegee.org.
For more options, visit https://groups.google.com/d/optout.