Python 在多对多中间类/模型Django中返回非空字段

Python 在多对多中间类/模型Django中返回非空字段,python,django,Python,Django,我认为这是一个python问题(可能是列表中x的),但可能有django框架查询/或类似的问题 我有一个中间类/模型: class VehicleFeatures(models.Model): personal_equipment = models.OneToOneField(PersonalEquipment, null=True, blank=True, ) commercial_equipment = models.OneToOneField(CommercialEquip

我认为这是一个python问题(可能是列表中x的
),但可能有django框架查询/或类似的问题

我有一个中间类/模型:

class VehicleFeatures(models.Model):
    personal_equipment = models.OneToOneField(PersonalEquipment, null=True, blank=True, )
    commercial_equipment = models.OneToOneField(CommercialEquipment, null=True, blank=True, )
    personal_vehicle = models.OneToOneField(PersonalVehicle, null=True, blank=True, )
    commercial_truck = models.OneToOneField(CommercialTruck, null=True, blank=True, )
    commercial_tractor = models.OneToOneField(CommercialTractor, null=True, blank=True, )
    …

    def __unicode__(self):
        # assume one and only one is allowed
        return '{}'.format(self.whichever_of_the_fields_exists)
        # Extra Credit :)
        # assume any number is allowed
如何返回包含引用的Model.field(最终获取该模型的名称,并传递回多对多模型的另一端)

注:

  • 尝试遵循选项2和3
  • 我并不担心性能,但如果你知道一个低成本的选择,那么请告诉我们为什么一个比另一个好
  • 模型的可视化
    • 121参考:车辆(抽象模型)和具体模型[如上所列]
    • M2M:车辆功能(连接到混凝土模型)
    • 12M:功能(许多车辆功能的字段)

在类似的“实体属性值”模型中,有时使用的一种方法是添加一个额外的字段,填充
OneToOneField
。大概是这样的:

class VehicleFeatures(models.Model):
    personal_equipment = models.OneToOneField(PersonalEquipment, null=True, blank=True, )
    commercial_equipment = models.OneToOneField(CommercialEquipment, null=True, blank=True, )
    personal_vehicle = models.OneToOneField(PersonalVehicle, null=True, blank=True, )
    commercial_truck = models.OneToOneField(CommercialTruck, null=True, blank=True, )
    commercial_tractor = models.OneToOneField(CommercialTractor, null=True, blank=True, )

    # Add a field to store the type of relation that is set for this instance
    relation_type = models.CharField(max_length=50)
保存对象时,对列表中的x执行
操作,确定哪个字段不为空,并将
关系类型设置为该字段的名称,例如:

def save(self):
    for k in ['personal_equipment', 'commercial_equipment', 'personal_vehicle' ...]:
        if getattr(self, k) is not None:
            self.relation_type = k
    return super(VehicleFeatures, self).save()
这比每次查询对象时执行相同的循环要高效得多

然后您的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

def __unicode__(self):
    return '{}'.format(getattr(self, self.relation_type))
这适用于只设置一个字段的情况,但您可以很容易地扩展它以支持多个字段-例如,通过将
关系类型
设置为逗号分隔的字符串,或者如果您的数据库支持,则将其设置为
数组字段