Python 在多对多中间类/模型Django中返回非空字段
我认为这是一个python问题(可能是列表中x的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
),但可能有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))
这适用于只设置一个字段的情况,但您可以很容易地扩展它以支持多个字段-例如,通过将关系类型
设置为逗号分隔的字符串,或者如果您的数据库支持,则将其设置为数组字段