Администратор django list_display SQL joindata - PullRequest
1 голос
/ 06 марта 2019

Страницы, созданные из существующих php, заменяются на python и Django.

Существующий запрос

Select
    l.lawyer_idx,
    l.lawyer_email,
    lp.lawyer_profile_path,
    lp.lawyer_profile_name,
    lc.lawyer_company_name,
    lc.lawyer_company_address,
    lc.lawyer_detail_address,
    l.lawyer_agent
from lawyer l
left join lawyer_profile lp on l.lawyer_idx = lp.lawyer_idx
left join lawyer_company lc on l.lawyer_idx = lc.lawyer_idx
order by l.register_date desc;

Я создал каждую таблицу на models.py

    models.py

    class Lawyer(models.Model):
     lawyer_idx = models.AutoField('ID', primary_key=True)
      lawyer_email = models.CharField('E-mail', unique=True, max_length=200)
     lawyer_agent = models.CharField(max_length=1, blank=True, null=True)

    class Meta:
       managed = False
       db_table = 'lawyer'


    class LawyerProfile(models.Model):
     lawyer_idx = models.AutoField('ID', primary_key=True)
     lawyer_profile_path = models.CharField(max_length=200, blank=True, null=True)
   lawyer_profile_name = models.CharField(max_length=100, blank=True, null=True)
.................

    class LawyerCompany(models.Model):
     lawyer_idx = models.AutoField('ID', primary_key=True)
     lawyer_company_name = models.CharField(max_length=100)
    ...............

Мы хотели бы поместить следующий запрос в часть list_display Django Admin.py. Есть ли способ показать данные, которые действительно были объединены в sql?

    Admin.py
    from django.contrib import admin
    from .models import Lawyer, LawyerCompany, LawyerProfile

    @admin.register(Lawyer)
    class LawyerAdmin(admin.ModelAdmin):

       list_per_page = 100
       **list_display = ['lawyer_idx', 'lawyer_email', 
'lawyer_agent', 'lawyer_profile_path', 'lawyer_profile_name', 'lawyer_company_name']**

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете добавить запрос как необработанный SQL-запрос, но тогда он не будет широко использовать ORM Джанго.

Вы явно не определяете какие-либо отношения в своих моделях, поэтому Джанго не знает, как связаны ваши модели.

Если lawyer_idx ссылается на адвоката, вы можете изменить поле на OneToOneField / ForeignKey (AutoField, вероятно, в любом случае здесь неправильный выбор, поскольку значения должны соответствовать значениям в модели Lawyer и не быть автоматически сгенерированным). Также ознакомьтесь с документацией для отношений один-к-одному и многие-к-одному .

class LawyerProfile(models.Model):
     lawyer = models.OneToOneField(Lawyer, primary_key=True, 
         db_column="lawyer_idx", related_name="profile")

Джанго должен автоматически выполнять соединения при доступе к связанным данным; на экземпляре Lawyer вы можете получить доступ к профилю через related_name .profile. В опции list_display вы можете использовать синтаксис двойного подчеркивания для доступа к связанным данным:

list_display = ['lawyer_idx','lawyer_agent', 'profile__lawyer_profile_path']
list_select_related = ['profile']

Если вы добавите параметр list_select_related Django уже присоединится к указанной таблице заранее, поэтому при обращении к связанным данным дополнительные запросы не выполняются.

...