使用外键的Django三向联接

使用外键的Django三向联接,django,join,models,Django,Join,Models,我最近开始评估Django,以迁移10年前编写的过时web应用程序。在过去的几天里,我一直在阅读Django文档,但在我的例子中,还没有找到实现多表数据库联接的最佳方法: Model: class Product(models.Model): productid = models.IntegerField(primary_key=True, db_column='ProductId') productname = models.CharField(max_length=120

我最近开始评估Django,以迁移10年前编写的过时web应用程序。在过去的几天里,我一直在阅读Django文档,但在我的例子中,还没有找到实现多表数据库联接的最佳方法:

Model:

class Product(models.Model):
    productid = models.IntegerField(primary_key=True, db_column='ProductId') 
    productname = models.CharField(max_length=120, db_column='ProductName')

class Testcases(models.Model):
    testcaseid = models.IntegerField(primary_key=True, db_column='TestCaseId')
    testcasename = models.CharField(max_length=240, db_column='TestCaseName')

class Testmatrix(models.Model):
    testmatrixid = models.IntegerField(primary_key=True, db_column='TestMatrixId')
    productid = models.ForeignKey(Product, db_column='ProductId')
    testcaseid = models.ForeignKey(Testcases, db_column='TestCaseId')

class Status(models.Model):
    testmatrixid = models.ForeignKey(Testmatrix, db_column='TestMatrixId')
    title = models.CharField(max_length=240, db_column='Title', blank=True)
(请注意,该模型是由inspectdb生成的,我不希望在此时修改它)

模板在这一点上被设计为最小,以帮助关注(视图/模型)中的实际问题

模板:(products.html)
{%extends“main.html”%}
{%block body%}
{tm%中的tm为%tm}
{{tm.testmatrixid}}
{{tm.testcaseid.testcasename}
{%endfor%}
{%endblock%}
问题:

虽然我能够连接Testmatrix和Testcase模型,但我无法通过连接所有Testmatrix、Testcase和say productid='abc'上的状态记录来生成等效的queryset

我尝试了以下方法:

1) 在Testmatrix和Testcases以及产品表之间使用select_related,并能够访问所有三个模型(testmatrixid、productid、productname、testcaseid、testcasename)的属性。但是,我不确定如何将这个自动外键引用扩展到状态模型。如果所有外键都是在Testmatrix本身中定义的,那么这会更容易。但是Status有一个TestMatrix的外键

2) 我试着使用如下内容:entries=Status.objects.filter(testmatrixid\uuu productid=pid)。这再次给了我一个queryset,作为连接Testmatrix和Status的结果,而不是测试用例


请原谅任何明显的错误或错误。这是我的第一篇帖子

如果没有任何特定的错误消息,则很难诊断上述错误的原因。但是,在您的示例中,在views.get_products:
tm=list(Testmatrix.objects.filter(productid='abc'))
将不起作用,因为'abc'是一个字符串,而您的productid实际上是一个产品对象(不仅仅是一个整数,即使该字段是引用表主键的整数外键);您可以执行
tm=list(Testmatrix.objects.filter(productid=Product.objects.get(Product_name='abc'))
,假设“abc”是产品记录的产品名称。当您将字段设置为models.ForeignKey(…)时,您可以将该引用记录作为对象而不是id进行寻址

除此之外,没有什么值得大惊小怪的,你的模板看起来很坚固,你的模型对我来说也很好。我建议创建一些测试用例,看看错误在哪里:;另外,这也是一个很好的教程,可以了解Django的TDD和单元测试。使用unittests,你可以验证应用程序的每个步骤,并保证将来进行更新.

因此您需要访问。它非常简单

首先,在此处添加
相关的\u名称

class Status(models.Model):
    testmatrixid = models.ForeignKey(Testmatrix, db_column='TestMatrixId', related_name='statuses')
现在您可以获得所需Testmatrix的所有状态,如

test_matrix.statuses.all()

如果你不想点击DB,当你访问
状态时,不要忘记使用
选择相关的

谢谢!这很有效。我错过了最后一英里:反向外键查找的“相关名称”。感谢你澄清外键数据类型(整数与对象)之间的区别-这现在是有道理的。我没有收到任何错误,但我得到的是空的querysets[],直到现在我才找到解释原因的方法。我还将阅读Django单元测试-这是对自学者的一些宝贵建议。谢谢!
class Status(models.Model):
    testmatrixid = models.ForeignKey(Testmatrix, db_column='TestMatrixId', related_name='statuses')
test_matrix.statuses.all()