我有两个应用程序:
trains
提供Train
模型和railroad
Rail
模型。由于我非常喜欢火车,我想确保Train
只能驾驶兼容的Rail
,因此我会实施TrainRailCompatibility
。但是,我无法同时修改Train
和Rail
模型以添加字段ManyToMany(through=TrainRailCompatibility)
(我不是这些应用的维护者)。我仍然希望能够在我的项目中执行类似my_train.compatible_rails.all()
或filter(foo__trains__compatible_rails__in=[...])
的内容。
有没有办法/最好的方法来实现它?
答案 0 :(得分:2)
您只需将此课程添加到您想要的应用程序
即可class TrailRailCompatibility(models.Model):
train = models.ForeignKey('app1.Train')
rail = models.ForeignKey('app2.Rail')
现在TrailRailCompatibility
- 类将通过
from app1.models import Train
from app2.models import Rail
Trail.trailrailcompatibility_set.all()
Rail.trailrailcompatibility_set.all()
答案 1 :(得分:1)
看起来这是管理问题,因为您无法以适当的方式做某事。解决方法很难看,因为它使用子查询而不是连接。
class Compatibility(models.Model):
train = models.ForeignKey('trains.Train', related_name='compatibilities')
rail = models.ForeignKey('railroad.Rail', related_name='compatibilities')
class Meta:
unique_together = ('train', 'rail')
def get_trains(rails):
return Train.objects.filter(compatibilities__rail__in=rails)
def get_rails(train):
return Rail.objects.filter(compatibilities__train_id=train.id)
答案 2 :(得分:0)
我不认为可以在ManyToMany
和Train
模型上添加Rail
字段的情况下完成此操作。您可以使用[{1}}和TrainRailCompatibility
的外键创建常规Train
模型,然后设置Rail
,然后手动添加条目。您只是无法通过unique_together = ('train', 'rail')
和Train
模式访问它们。