返回多个字段时的Django Query

时间:2014-11-26 11:32:01

标签: python django django-queryset

我有一个模型,我想将return字段从单个字段更改为连接的字段字符串。我已经完成了这个并且它工作正常,当我尝试查询与该模型相关的外键时会出现问题。

当前代码

Models.py - 项目应用

class Details(models.Model):
    serial_number = models.CharField(max_length = 300, unique=True, null = True, blank = True)
    manufacturer = models.CharField(max_length = 300, null = True, blank = True)
    model_type = models.CharField(max_length = 300, null = True, blank = True)
    equipment_type = models.CharField(max_length = 300, null = True, blank = True)

    class Meta:
        ordering = ["serial_number"]

    def __unicode__(self):  # Python 3: def __str__(self):
        return self.serial_number

Views.py - 乐器应用:查询

queryset = InstrumentAnnual.objects.get(instrument_details__serial_number = self.object.instrument_annual, current_revision = True)

注意: ' InstrumentAnnual '模型有一个名为'详细信息'模型的外键,名为' Instrument_Details '

新代码

Models.py - 项目应用

class Details(models.Model):
    serial_number = models.CharField(max_length = 300, unique=True, null = True, blank = True)
    manufacturer = models.CharField(max_length = 300, null = True, blank = True)
    model_type = models.CharField(max_length = 300, null = True, blank = True)
    equipment_type = models.CharField(max_length = 300, null = True, blank = True)

    class Meta:
        ordering = ["serial_number"]

    def __unicode__(self):  # Python 3: def __str__(self):
        return u"%s %s %s" % (self.manufacturer, self.model_type, self.equipment_type)

所以我的问题是如何通过外键查询上述模型,因为它不再返回self.serial_number,因此我无法在查询中使用__serial_number

我想要的结果只是在外键下拉列表中显示manufacturermodel_typeequipment_type,而不仅仅是一个可能没有意义的序列号。如果我以错误的方式解决这个问题,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您不必按照当前的方式执行查询集。如果要获取属于Detail对象的InstrumentAnnual对象,可以使用self.object.instrumental_annual(假设self.object是您的Detail对象,就像在示例中一样。

至于如何修复提供的查询,您当前正在检查带有InstrumentAnnual对象的字符串表示的序列号。但那不再是你的序列号了。相反,你会这样做

queryset = InstrumentAnnual.objects.get(instrument_details__serial_number = self.object.instrument_annual.serial_number, current_revision = True)

指定您实际上要检查序列号。但正如已经说过的那样,不需要这个查询集,因为您可以通过self.object.instrumental_annual轻松获取InstrumentAnnual对象