Python/Django循环依赖模型.py(不在外国钥匙等)

2024-04-24 05:08:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有xmodels.py个文件,在x个不同的Django应用程序中。我有一些关于我在整个应用程序中调用的模型的查询。我认为最好的干燥方法是让查询被模型内部的方法调用。在

这些查询方法实际上查询/other/apps中的/other/models(以及其他models.py文件)。我知道这会增加耦合,但这是一个大型且高度专业化的项目,所以我不能为很多东西编写通用的可重用应用程序。在

例如:

class Mentor(models.Model):
    # ...
    def get_future_shifts(self):
        return Shift.objects.filter(mentor = self, session__date__gt = timezone.now())

我最终得到了一个循环依赖(它跨越了4个应用程序,所以我认为除非绝对必要,否则在这里发布所有代码太长了)。在

SO上Django模型通常的循环依赖性建议与models.ForeignKey有关,这不是我的问题。我真的需要进入“外国”模式。在

有人告诉我循环依赖是糟糕设计的标志,而我糟糕的设计是我的模型中有太多的动态辅助方法?Django并没有真正提供任何其他地方来放置这些没有坚持干燥。在


Tags: apps文件项目django方法py模型self
2条回答

您的get_future_shifts()方法意味着ShiftMentor上有一个FK。在这种情况下,您不需要在包含Mentor的模块中导入Shift,只需使用反向关系即:

class Mentor(models.Model):
    # ...
    def get_future_shifts(self):
        return self.shift_set.filter(session__date__gt=timezone.now())

但这只会“从技术上”解决循环依赖,因为这意味着Mentor对另一个应用程序有一些直接的了解,这个应用程序本身依赖于定义了Mentor的应用程序,如果从设置中删除这个其他应用程序,整个过程将中断。在

另一个解决方案是在同一个应用程序中定义get_future_shiftsShift' and monkeypatch导师`,即:

^{pr2}$

有些人会反对从另一个模块/应用程序扩展一个类,但是仅仅在Mentor上定义FK就已经扩展了Mentor,所以至少我们把相关的东西放在一起,现在MentorShift没有直接的依赖关系——只要Mentor的应用程序视图等都不依赖get_future_shifts(),但这意味着{}应该与Mentor属于同一个应用程序。在

有一个方法,django.db.models.get_model(),它获得一个给定名称的模型。这将修复它,因为您实际上并没有导入模型。在

相关问题 更多 >