【问题标题】:Queryset is not filtered although there is data in table?尽管表中有数据,但查询集没有被过滤?
【发布时间】:2015-01-14 18:02:43
【问题描述】:

这些是我的 Models.py 中的内容

class InstituteType(models.Model):
    institute_type_id = models.AutoField(primary_key=True)
    institute_type_name = models.CharField(max_length = 50)
    institute_type_description = models.TextField(max_length = 300)

class InstituteMasters(models.Model):
    institute_id = models.AutoField(primary_key=True)
    institute_name = models.CharField(max_length=100)
    institute_institute_type = models.ForeignKey(InstituteType,verbose_name="Institute Type")
    institute_district = models.ForeignKey(Districts, verbose_name = "District")
    institute_vdc_municipality = models.ForeignKey(VdcMunis,null=True,blank=True,verbose_name="VDC/Municipality")
    #.....

class InstituteInfos(models.Model):
    institute_info_id = models.OneToOneField(InstituteMasters,primary_key=True,verbose_name="Name of Institute",null=False)
    vision = models.TextField(max_length=500, blank=True)
    mission = models.TextField(max_length=500, blank=True)
    goal = models.TextField(max_length=500, blank=True)
    #......

表中有 3 行与模型 InstituteTypes 相关..
研究所类型ID;研究所类型名称;研究所类型描述
1;构成;一些文本
2;技术服务;一些文本
3;附属;一些文本

InstituteMasters 表中有很多行包含所有 1,2,3 的 InstituteTypes id

但有趣的是!在 python manage.py shell

>>> xx = InstituteInfos.objects.filter(institute_info_id__institute_institute_type__institute_type_id = 1)
>>> xx

返回对象

>>> xx = InstituteInfos.objects.filter(institute_info_id__institute_institute_type__institute_type_id = 2)
>>> xx

返回 []

为什么我不能过滤 InstituteMasters 字段 inistitute_institute_type 设置为 2 的 InstituteInfos?类型 1 和 3 的代码过滤器相同。如果我从 InstituteMasters 过滤,则返回所有 1、2、3。

【问题讨论】:

  • 显而易见的答案是您要过滤的特定组合在数据库中不存在
  • 感谢@Anetropic。我必须严格检查我的数据库。发现我的导入过程中缺少一些数据。

标签: python django django-queryset


【解决方案1】:

您的设计存在许多问题。我能给你的最有力的建议是阅读 Django 文档和教程,并以这种方式制作你的模型。你这样做的方式是很多额外的工作,没有任何收获。

我怀疑您遇到的特殊问题是您的institution_info_id 字段作为主键和外键具有双重职责。这不是一个不可能的设计,但 IMO 它是一个非常脆弱的设计。

请考虑进行一些简化以提高可读性。如果你的模型看起来更像这样不是很好吗?

class InstituteType(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField(max_length=300)

class InstituteMasters(models.Model):
    name = models.CharField(max_length=100)
    institute_type = models.ForeignKey(InstituteType)
    #.....

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 2019-09-04
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多