Django:在我无法修改的两个应用之间添加ManyToMany

时间:2017-01-19 08:46:29

标签: django django-models

我有两个应用程序:

  • trains提供Train模型和
  • railroad Rail模型。

由于我非常喜欢火车,我想确保Train只能驾驶兼容的Rail,因此我会实施TrainRailCompatibility。但是,我无法同时修改TrainRail模型以添加字段ManyToMany(through=TrainRailCompatibility)(我不是这些应用的维护者)。我仍然希望能够在我的项目中执行类似my_train.compatible_rails.all()filter(foo__trains__compatible_rails__in=[...])的内容。

有没有办法/最好的方法来实现它?

3 个答案:

答案 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)

我不认为可以在ManyToManyTrain模型上添加Rail字段的情况下完成此操作。您可以使用[{1}}和TrainRailCompatibility的外键创建常规Train模型,然后设置Rail,然后手动添加条目。您只是无法通过unique_together = ('train', 'rail')Train模式访问它们。