【问题标题】:Get all objects from severall models that share the same foreign key - Is it possible?从共享相同外键的多个模型中获取所有对象 - 有可能吗?
【发布时间】:2017-02-10 19:44:08
【问题描述】:

我在使用 Django 框架设计数据库时遇到了一个我似乎无法解决的问题。假设我有以下型号:

class Report(models.Models):
    equipment = models.ForeignKey(Equipament)
    category = models.ForeignKey(Category)
    date = models.DateField()
    user = models.CharField(max_length=100)

class TestA(models.Model):
    report = models.ForeignKey(Report)
    lasers = models.FloatField()
    table = models.FloatField()
    dose = models.FloatField()
    pass_fail = models.NullBooleanField()

class TestB(models.Model):
    report = models.ForeignKey(Report)
    ctdi = models.FloatField()
    pass_fail = models.NullBooleanField()

class TestC(models.Model):
    report = models.ForeignKey(Report)
    pass_fail = models.NullBooleanField()

我的问题是:是否有可能从测试 B、C 和 D 中获取共享报告中相同对象的所有对象?我不希望单独查询每个模型(TestB、TestC 或 TestD),因为实际上我有更多的测试模型。
非常感谢任何帮助。

【问题讨论】:

  • 你是说你有一个ModelA对象,你想得到相关的ModelB、C、Ds?这似乎也可能与您的问题有关stackoverflow.com/a/2315053/4974980
  • @JensAstrup 谢谢。这正是我想要做的。我去看看。
  • @JensAstrup 感谢您的提示。虽然这是一个类似的问题,但我无法解决它。似乎已弃用用作解决方案的“get_all_related_objects()”方法。这似乎是一件“可行的”事情。我正在寻求查询 ModelA 对象并从其他模型中获取所有相关的对象...
  • 所有这些相关模型是什么样的(就包含的字段而言)。而不是使用ABC,你能发布一个好的样本吗?谢谢
  • @e4c5 更新了我的帖子。我正在对设备进行测试。每个测试都有不同的值要保存,所以我为每个测试创建了不同的模型。我虽然通过给他们一个外键到同一个报告对象来关联所有的测试,所以我实际上可以提供一个包含所有测试的报告。认为这很容易,但似乎无法解决。

标签: django django-models django-queryset foreign-key-relationship


【解决方案1】:

为什么你有三种不同的模型,它们本质上是一样的?试试这个:

class Report(models.Models):
    equipment = models.ForeignKey(Equipment)
    category = models.ForeignKey(Category)
    date = models.DateField()
    user = models.CharField(max_length=100)

class Result(model.Model):
    report = models.ForeignKey(Report)
    status = models.BooleanField(default=False)
    lasers = models.FloatField(blank=True, null=True)
    table = models.FloatField(blank=True, null=True)
    ctdi = models.FloatField(blank=True, null=True)
    dose = models.FloatField(blank=True, null=True)
    title = models.CharField(max_length=200)

只需给每个报告一个标题,例如'TestA' / 'TestB',而不是创建一个全新的模型。

要获得报告的所有结果:

r = Result.objects.filter(report=Report.objects.get(pk=1))

【讨论】:

  • 你的意思是给每个结果一个标题...我没有这样做,因为要对设备执行的每个测试都是不同的。 TestA 没有所有这些字段...
  • 这就是为什么所有这些字段都是可选的并且默认为NULL。因此,您只需输入对您正在进行的测试有意义的字段。
  • @BurhanKhalidi 它确实让事情更容易联系起来。有没有办法根据 FK 选择仅自动加载某些字段?例如,如果我在报告中选择类别以仅加载某些字段?否则,当我呈现表单时,所有内容都将在 html 中进行硬编码。
  • 您可以在视图中轻松处理此问题。
  • 谢谢。我会试一试,虽然它看起来不太现实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2020-12-23
相关资源
最近更新 更多