【问题标题】:Changing lookup parameters for Django object query更改 Django 对象查询的查找参数
【发布时间】:2013-06-20 21:35:07
【问题描述】:

我的 Django 项目中的两个模型是

class ContractPlans(models.Model):
  cp_id = models.CharField(primary_key = True, db_column = "ContractPlanId", max_length = 100L)
  parentorg = models.ForeignKey("Parentorgs")
  contractnum = models.ForeignKey("Contracts", db_column = "ContractNum")
  plan_id = models.CharField(max_length = 100L, db_column = "PlanID")
  eff_date = models.DateField()
  exp_date = models.DateField(null=True, blank=True)
  planname = models.CharField(max_length=100L, db_column='PlanName') 


class ContractPlanTags(models.Model):
  contract_plan_id = models.IntegerField(primary_key = True, db_column = "table_id")
  parentorg = models.ForeignKey("Parentorgs", db_column = "parentorg_id")
  contractnum = models.ForeignKey("Contracts", db_column = "ContractNum")
  planid = models.ForeignKey("ContractPlans", db_column = "PlanId")
  tag_id = models.IntegerField()
  tag_value_id = models.ForeignKey("Tags", db_column = "tag_value_id")
  eff_date = models.DateField()
  exp_date = models.DateField(null=True, blank=True)

我正在对ContractPlanTags 执行prefetch_related() 查询

lst = ContractPlanTags.objects.prefetch_related().filter(parentorg = request.REQUEST["parentorg"])

这是为了在一次数据库命中中获取与该模型类关联的所有外键对象。

我的问题是 Django 不断抛出错误

DoesNotExist: ContractPlans matching query does not exist. 
Lookup parameters were {'cp_id__exact': u'805'}

我想要做的是在序列化器循环中提取与ContractPlans.plan_idContractPlans.planname 关联的值,以作为JSON 对象传递给视图。

我该如何解决这个错误?

【问题讨论】:

  • 您在数据库中是否有 ID 为 805 的 ContractPlans 的记录?
  • 请注意,prefetch_related 实际上并没有避免多个数据库查询。 select_related 确实如此,而且在这里可能更合适。但是,如果您的数据库的外键损坏,您仍然会遇到异常。

标签: python django django-models


【解决方案1】:

当您过滤 foreign key 时,您需要传递该外部模型的对象:

parent_org = get_object_or_404(Parentorgs, pk=request.REQUEST["parentorg"])
lst = ContractPlanTags.objects.prefetch_related().filter(parentorg = parent_org)

【讨论】:

  • 我认为错误在另一部分。从字面上看,您正在尝试从数据库中提取 ID 为 805 的 ContractPlan,但它不存在。你能检查一下它是否存在吗?
【解决方案2】:

错误告诉你出了什么问题:

DoesNotExist: ContractPlans matching query does not exist. 
Lookup parameters were {'cp_id__exact': u'805'}

您的一个ContractPlanTags 对象的外键无效。您需要通过将密钥设置为 None 或使用 805 的 cp_id 创建缺少的 ContractPlans 对象来解决此问题。

您还应该正确地执行您的数据库完整性,以防止它在未来发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2016-04-22
    • 1970-01-01
    • 2017-11-14
    • 2022-01-18
    • 2019-07-27
    相关资源
    最近更新 更多