#34178: Prefetching a foreign key on GenericForeignKey results in incorrect
queryset being selected
-------------------------------------+-------------------------------------
               Reporter:  Rohan      |          Owner:  nobody
  Nahata                             |
                   Type:  Bug        |         Status:  new
              Component:  Database   |        Version:  4.1
  layer (models, ORM)                |       Keywords:  GenericForeignKey,
               Severity:  Normal     |  prefetch_related
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 These are the models that I created to test my hypothesis. .
 {{{
 class Foreign(models.Model):
     value = models.CharField(max_length=20)

 class OtherForeign(models.Model):
     value = models.CharField(max_length=20)

 class A(models.Model):
     f = models.ForeignKey(Foreign, on_delete=models.PROTECT)

 class B(models.Model):
     f = models.ForeignKey(OtherForeign, on_delete=models.PROTECT)

 class X(models.Model):
     ct = models.ForeignKey(ContentType, on_delete=models.PROTECT)
     object_id = models.IntegerField()
     object = GenericForeignKey(ct_field='ct', fk_field='object_id')
 }}}

 The tables were populated with this sample data.
 {{{
 Foreign

 id|value
 1|A1
 2|A2
 3|A3
 4|A4
 5|A5
 6|A6
 7|A7
 8|A8
 9|A9
 10|A10


 Other Foreign

 id|value
 1|B1
 2|B2
 3|B3
 4|B4
 5|B5
 6|B6
 7|B7
 8|B8
 9|B9
 10|B10

 A

 id|f_id
 1|1
 2|2
 3|3
 4|4
 5|5
 6|6
 7|7
 8|8
 9|9
 10|10

 B

 id|f_id
 1|1
 2|2
 3|3
 4|4
 5|5
 6|6
 7|7
 8|8
 9|9
 10|10

 X
 id|object_id|ct_id
 1|1|11
 2|2|11
 3|3|11
 4|4|11
 5|5|11
 6|6|11
 7|7|11
 8|8|11
 9|9|11
 10|10|11
 11|1|10
 12|2|10
 13|3|10
 14|4|10
 15|5|10
 16|6|10
 17|7|10
 18|8|10
 19|9|10
 20|10|10

 }}}

 Based on this data :

 {{{
 ->> xx = X.objects.prefetch_related('object').all().order_by('id')
 ->> xx[0].object.f.value
 'A1'
 ->> xx[10].object.f.value
 'B1'
 }}}
 This behaviour is correct.

 However, when we chain another prefetch to the same,
 {{{
 ->> xx = X.objects.prefetch_related('object',
 'object__f').all().order_by('id')
 ->> xx[0].object.f.value
 'A1'
 ->> xx[10].object.f.value
 'A1'
 }}}
 Here, {{{xx[10].object}}} returns the correct object, however, when
 {{{xx[10].object.f}}} is evaluated it refers to model A instead of model
 B. This leads me to believe that there is some sort of faulty caching
 going on in the background that leads to model A being used.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34178>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701849f27132a-6a2fd1f7-b8c6-4b6b-afce-30c1cdd5c0da-000000%40eu-central-1.amazonses.com.

Reply via email to