【问题标题】:django admin list_display SQL joindatadjango admin list_display SQL joindata
【发布时间】:2019-07-28 03:28:23
【问题描述】:

由现有 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)
    ...............

我们想将以下查询放入 Django Admin.py 的 list_display 部分有没有办法显示在 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']**

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您可以将查询添加为原始 sql 查询,但这不会充分利用 Django 的 ORM。

    您没有在模型上明确定义任何关系,因此 Django 不知道您的模型是如何关联的。

    如果lawyer_idx 引用了律师,您可以将字段更改为OneToOneField/ForeignKey(无论如何,AutoField 在这里可能是错误的选择,因为这些值应该对应于Lawyer 模型中的值并且不会自动生成)。另请查看one-to-onemany-to-one 关系的文档。

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

    Django 在访问相关数据时应该自动执行连接;在Lawyer 实例上,您可以通过其related_name .profile 访问配置文件。在list_display 选项中,您可以使用双下划线语法访问相关数据:

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

    如果添加list_select_related option Django 已经预先加入了指定的表,所以在访问相关数据时不会执行额外的查询。

    【讨论】:

    • 谢谢~!我遇到了问题。文件“C:\workspace\bhsn\models.py”,第 603 行,在 LawyerProfile 律师_idx = models.OneToOneField(Lawyer, primary_key=True, db_column='lawyer_idx', related_name='profile') TypeError: __init__() missing 1所需的位置参数:'on_delete'
    • 是的,您需要添加一个on_delete=models.CASCADE docs.djangoproject.com/en/2.1/ref/models/fields/…
    • 我试试这个!!!!!!model.py 类 LawyerCompany(models.Model):lawyer_idx = models.OneToOneField(Lawyer, primary_key=True, db_column="lawyer_idx", related_name="profile ", on_delete='models.CASCADE') law_company_name = models.CharField(max_length=100) AND admin.py -> list_display = ('lawyer_idx', 'profile__lawyer_company_name',) 但是!!!!!!!!!错误: : (admin.E108) 'list_display[6]' 的值指的是 'profile__lawyer_company_name',它不是可调用的,不是 'LawyerAdmin' 的属性,也不是 on 的属性或方法'bhsn.Lawyer'。
    • 对不起,我忽略了这似乎不适用于OneToOneField,但你可以像在这个问题stackoverflow.com/questions/20652949/…中那样做
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2016-01-05
    • 2019-06-13
    • 2019-05-13
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多