Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql django queryset联合体不能仅与_Mysql_Django_Django Models_Django Queryset - Fatal编程技术网

Mysql django queryset联合体不能仅与

Mysql django queryset联合体不能仅与,mysql,django,django-models,django-queryset,Mysql,Django,Django Models,Django Queryset,我有两个查询集,我正在对它们应用联合,但奇怪的是,当我只使用时,它从数据库中选择所有字段,当我使用值时,它只选择给定字段 这是从医生表中选择所有字段 doctors_models.Physician.objects.filter( appointments__member=self.context['member'] ).union(doctors_models.Physician.objects.filter( appointments__booked_by=self.cont

我有两个
查询集
,我正在对它们应用
联合
,但奇怪的是,当我只使用
时,它从数据库中选择所有字段,当我使用
值时,它只选择给定字段

这是从
医生表中选择所有字段

doctors_models.Physician.objects.filter(
    appointments__member=self.context['member']
).union(doctors_models.Physician.objects.filter(
    appointments__booked_by=self.context['member']
)).only('id', 'name_prefix', 'first_name', 'middle_name', 'last_name', 'name_suffix')
doctors_models.Physician.objects.filter(
    appointments__member=self.context['member']
).union(doctors_models.Physician.objects.filter(
    appointments__booked_by=self.context['member']
)).values('id', 'name_prefix', 'first_name', 'middle_name', 'last_name', 'name_suffix')
但是 这是从
医生
表中仅选择指定字段

doctors_models.Physician.objects.filter(
    appointments__member=self.context['member']
).union(doctors_models.Physician.objects.filter(
    appointments__booked_by=self.context['member']
)).only('id', 'name_prefix', 'first_name', 'middle_name', 'last_name', 'name_suffix')
doctors_models.Physician.objects.filter(
    appointments__member=self.context['member']
).union(doctors_models.Physician.objects.filter(
    appointments__booked_by=self.context['member']
)).values('id', 'name_prefix', 'first_name', 'middle_name', 'last_name', 'name_suffix')
但是,这也是只选择指定的字段,但为什么要定义两次字段呢

doctors_models.Physician.objects.filter(
    appointments__member=self.context['member']
).only('id', 'name_prefix', 'first_name', 'middle_name', 'last_name', 'name_suffix').union(
    doctors_models.Physician.objects.filter(
        appointments__booked_by=self.context['member']
).only('id', 'name_prefix', 'first_name', 'middle_name', 'last_name', 'name_suffix'))
但是,这也是只选择指定的字段,但为什么要定义两次字段

因为
SELECT
语句的列数及其类型应该匹配,如下所示:

只要所有
QuerySet
s中的
列表相同,传递不同的模型就可以工作(至少类型,只要类型的顺序相同,名称就无关紧要)。在这种情况下,必须使用
QuerySet
方法中应用于结果
QuerySet
的第一个
QuerySet
中的列名

也就是说,请不要首先使用
.union(…)
。您可以通过将这两个条件包装在
Q
对象中并将其与“or”组合来合并这两个条件:

从django.db.models导入Q
医生\模型.医生.对象.过滤器(
Q(约会\成员=self.context['member'])|
Q(预约者=self.context['member'])
)。仅限('id'、'name\u prefix'、'first\u name'、'middle\u name'、'last\u name'、'name\u suffix')

此外,仅建议对包含大量数据的列使用or。对于“小”列,它通常不会产生重大影响,如果您以后需要这些字段,它甚至可能会导致N+1问题。

如果您使用union,则两个部分必须具有相同数量的字段。它具有相同的字段。否,它不仅限制在SELECT查询中使用的字段,此外,通过使用Q对象,您还可以在单个查询中正确地执行此操作,Willem已经详细解释了1。或者查询将导致“索引将不被使用”,这就是为什么使用union。2.仅使用
,以便它不会获取所有不必要的字段。3.您说过,当两个查询中的列都相同并且都在我的查询中时,联合就起作用了。你看到的是不同的列吗?@SHIVAMJINDAL:如果你分别取消这两列的索引,它通常会使用这两个索引。通常一个数据库会在内部将其重写为一个联合,但优点是您自己不需要编写两个
SELECT
语句:@Willen这是写在mysql自动转换或查询的地方吗union@SHIVAMJINDAL:一个好的数据库收集统计数据,并根据统计数据制定查询计划。如果您进行查询,而数据库希望返回大量的行,那么它将不使用索引,因此扫描表的效率更高(因为即使它使用索引,以后也必须扫描以返回记录)。查询计划基于。因此,这意味着如果
约会
关系中由
s预订的不同的
数量较低,它将不会使用索引。@SHIVAMJINDAL:因此,查询计划不仅由查询决定,还与数据库期望检索的记录数有关。如果选择性为0.7,则它希望检索大量记录。