get foreign key objects in a single query - Django

后端 未结 3 706
感动是毒
感动是毒 2021-01-02 02:11

I have 2 models in my django code:

class ModelA(models.Model):
    name = models.CharField(max_length=255)
    description = models.CharField(max_length=255)         


        
相关标签:
3条回答
  • 2021-01-02 02:53

    The reason .select_related() didn't work, is that .select_related() is used to follow foreign keys. Your ModelA doesn't have a foreign key to ModelB. Its ModelB that has a foreign key to ModelA. (so a ModelA instance can have multiple ModelB instances related to it).

    You could use this to do it in 2 queries, and a bit of python code:

    list_b = ModelB.objects.all()
    list_a = ModelA.objects.all()
    for a in list_a:
        a.additional_data = [b for b in list_b if b.modela_link_id==a.id]
    
    0 讨论(0)
  • 2021-01-02 02:58

    As Ofri says, select_related only works on forwards relations, not reverse ones.

    There's no built-in way to automatically follow reverse relations in Django, but see my blog post for a technique to do it reasonably efficiently. The basic idea is to get all the related objects for every item at once, then associate them manually with their related item - so you can do it in 2 queries rather than n+1.

    0 讨论(0)
  • 2021-01-02 02:58

    Django ORM is a good thing but some some things is better to do manually. You may import connection cursor and execute raw sql in single query.

    from django.db import connection
    cur=connection.cursor()
    cur.execute(query)
    rows = cur.fetchall()
    

    your query should look like (for MySQL)

    SELECT * FROM appname_modela INNER JOIN appname_modelb ON appname_modela.id=appname_modelb.modela_link_id
    
    0 讨论(0)
提交回复
热议问题