Django:过滤多对多的字段给出了太多的答案?

时间:2013-04-18 13:34:39

标签: python django many-to-many

有以下四种模式

测量

class Measurement(models.Model):
    config = models.ForeignKey(MeasurementConfig)   
    energy = models.ForeignKey(Energy)   
    dose = models.DecimalField(max_digits=20,decimal_places=9, blank=True, null=True)

MeasurementConfig

class MeasurementConfig(models.Model):
    date = models.DateTimeField(auto_now_add=True)
    linac = models.ForeignKey(Linac)

直线加速器

class Linac(models.Model):
    name = models.CharField(max_length=10)
    genre = models.ForeignKey(Type)
    energies = models.ManyToManyField(Energy)

能源

class Energy(models.Model):
    value = models.PositiveIntegerField()
    category = models.ForeignKey(EnergyCategory)

现在我想从测量模型中获得特定直线加速器和能量的所有剂量测量结果。

我使用以下代码来获取这些代码:

linac = get_object_or_404(Linac, name=linacname)   

# Get all the energies for the specified linac
measurementconfigs = MeasurementConfig.objects.filter(linac=linac)
identifications = []
for measurementconfig in measurementconfigs:
    identifications.append(measurementconfig.identification)
config = get_object_or_404(MeasurementConfig, identification=identifications[0])
energies = config.linac.energies.all()

# Get the measurements
energymeasurements = []    
for energy in energies:
    measurements = Measurement.objects.filter(config__linac=linac).filter(config__linac__energies__exact=energy)
    energymeasurements.append(measurements)

我希望能量测量看起来像这样:

energymeasurements = [(Measurements_**Energy1**), (Measurements_**Energy2**), (Measurements_**EnergyN**)]

其中N是能量的数量

但我得到的是:

energymeasurements = [(Measurements_**ALLEnergies1**), (Measurements_**ALLEnergies2**), (Measurements_**ALLEnergiesN**)]

其中N是能量的数量。

所以我希望我的查询得到循环指定的特定能量的所有测量值。但相反,我得到了所有能量的测量值。 我已经通过仅使用特定能量的id来尝试没有循环,同样的问题也出现了。

我知道问题出现在查询中,但我找不到它是什么。

1 个答案:

答案 0 :(得分:1)

您的目标:

  

现在我想从测量模型中获得特定直线加速器和能量的所有剂量测量结果。

我的方法:

  1. 获取Linac记录。
  2. 使用多对多链接表获取相应的能源记录。
  3. 获取链接到Linac记录的所有MeasurementConfig记录。
  4. 对于每个MeasurementConfig记录,获取所有Measurement记录;使用能量记录过滤此记录集。
  5. 在您发布的代码中,根据您指定的模型,您似乎正在尝试过滤不存在​​的链接上的度量记录集。

    # Get the measurements
    energymeasurements = []    
    for energy in energies:
        measurements = Measurement.objects.filter(config__linac=linac).filter(config__linac__energies__exact=energy)
        energymeasurements.append(measurements)
    

    测量与Linac无关,所以我认为这就是为什么你没有得到你期望的结果。