【问题标题】:How to merge multiple QuerySets in django?如何在 django 中合并多个查询集?
【发布时间】:2017-03-09 04:07:22
【问题描述】:

我有以下型号

class Molecule(models.Model):
    mid = models.IntegerField(primary_key=True)
    mol_name = models.CharField(max_length=2023, blank=True, null=True)

class Pubchem(models.Model):
    molecule = models.OneToOneField('Molecule', primary_key=True, db_column='mid')
    pnum = models.IntegerField(blank=False, null=False)

在views.py 中,我正在尝试获取具有mid、mol_name 和pnum 是否可用的查询集。

querySet1 = Molecule.objects.all()

querySet1 = querySet1.filter(
            Q(mol_name__istartswith=currentInitial) |
            Q(mol_name__istartswith=currentInitial.lower()) 
            ).distinct('mol_name')

querySet2 = Pubchem.objects.filter(molecule__mol_name__istartswith=currentInitial).select_related('molecule').order_by('molecule')

在 querySet2 中,并非所有分子都包括在内,在 Pubchem 中没有条目的分子将被忽略。在 querySet1 或 querySet2 中应该改进什么以在 querySet 中获取所有必需的信息?还是合并它们是更好的选择?如果有怎么办?

【问题讨论】:

  • 我尝试使用链,但它使 2 种不同类型的模型成为一个查询集,并且不能用于分页。也会有重复的需要删除它们
  • 我也尝试通过添加一列来使用 Value() 注释,但没有奏效。
  • 也尝试了内容框架的方法,但是太复杂了,我觉得应该有更好的方法。但是没有用
  • 第一条评论:istartswith 不区分大小写,所以我不知道你为什么在这里使用Q 对象。其次,您能否举例说明您当前的示例到底做了哪些您不想要的操作?
  • 第一:是的,你是对的,在这种情况下不需要我尝试不同的东西,然后就这样离开了。它不会有所作为吗?第二:如果您看到此链接:dpaste.de/WGjV#L3,4,10,12,13 在 QuerySet2 中缺少标记为黄色,因为它们在 Pubchem 中没有 pnum 条目。但我也需要这些结果,我需要 mid、mol_name 以及 pnum 是否可用

标签: python django database django-queryset


【解决方案1】:

我认为你需要的是:

molecules = Molecule.objects.filter(
        mol_name__startswith=currentInitial
    ).select_related('pubchem')

#and now you have all molecules and some of them may have pubchems.
for molecule in molecules:
    print (molecule, molecule.pubchem.pnum if hasattr(molecule, 'pubchem') else None)

【讨论】:

  • 这可行,但结果集不是 QuerySet 是否也可以制作?
  • molecules 是一个查询集,我只是对其进行迭代以向您展示如何从molecule 对象访问pnum 数据。
猜你喜欢
  • 2013-09-06
  • 2014-07-08
  • 2019-08-11
  • 2021-11-10
  • 2017-10-09
  • 2012-12-20
  • 2017-12-04
  • 2021-08-05
  • 2010-10-17
相关资源
最近更新 更多