Django应用程序间导入的公认做法是什么 - python

Django和相互交互的应用程序很容易遇到导入问题。我的问题很简单:

最小化循环进口的公认流程是什么?或者有人提出了可接受的编码标准以减少他们愿意共享的编码标准?

我正在寻找可以标准化的良好原则。

楷模

class Program(models.Model):
    group = models.ForeignKey(Group, related_name="%(app_label)s_%(class)s_related") 

class Program(models.Model):
    group = models.ForeignKey('auth.Group', related_name="%(app_label)s_%(class)s_related") 

观看次数:

class ProgramDetailView(DetailView):
    """Detail view of the EEP Program"""

    def get_queryset(self):
        """Narrow this based on your company"""
        from apps.company.models import Company
        company = Company.objects.get(name="foo")
        return Program.objects.filter(company = company)

vs(这会引起问题。

from apps.company.models import Company
class ProgramDetailView(DetailView):
    """Detail view of the EEP Program"""

    def get_queryset(self):
        """Narrow this based on your company"""
        company = Company.objects.get(name="foo")
        return Program.objects.filter(company = company)

问题是您倾向于在整个地方进行很多导入。

参考方案

多年来,根据对以下方面的观察,我对一些模式进行了标准化
我如何开发Web应用程序。

我不知道您关于模块化和代码重用的标准是什么,但是
遵循简单的规则/模式在相当大的程度上帮助了我
项目。

我注意到我的许多模型都有一些共同的属性。例如
我更喜欢使用UUID代替简单的自动递增整数作为主键。

所以我有这个抽象模型。

class UUIDModel(models.Model):
    id = UUIDField(primary_key=True, auto=True)  # There are many implementation of this on the web. Choose your favorite.

    class Meta:
        abstract = True

我的许多模型都需要activation的概念。所以我有另一个抽象模型,
与此类似:

class ActivatedModel(Model):
    is_active = models.BooleanField(default=False)

    def activate(self, save=True):
        if self.is_active:
            raise Exception('Already activated')
        self.is_active = True
        if save:
            self.save()

    class Meta:
        abstract = True

我还使用许多其他抽象模型来跟踪创建时间和修改,或者
如果某些内容是finalized并且无法进一步修改等。

所有这些抽象模型都存在于core应用程序中。这就是我所说的。
除了core应用程序外,我还有一个tasks应用程序。 tasks应用提供摘要
我经常使用的与celery关联的任何模型的模型。

tasks应用程序可以从core应用程序导入模型,但反之则不能。

我还有一个mms应用,可处理多媒体的创建和转换(缩略图等)。 mms可以从以前的应用程序导入模型。因此,我们现在具有的导入关系是:核心->任务->彩信。

我创建的所有其他应用程序都特定于我正在从事并正在构建的当前项目
以前的应用程序。因此,基本上,我可以尝试使用“单向导入”。

最后,我得到的模型看起来与此类似:

# models.py of an app called  "articles"

from core.models import UUIDModel, ActivatedModel
from tasks.models import ManagedTasksModel

class Article(UUIDModel, ActivatedModel, ManagedTasksModel):
    title = models.CharField()
    # blah...

如果应用程序太大,我可以通过将models.py模块拆分为“微管理”该应用程序
遵循上述规则的较小模块。我发现这涵盖了
我最需要的

我无法评论基于类的视图,因为说实话我不喜欢它们,而且几乎
总是让我编写更多而不是更少的代码。给每个人自己。我更喜欢使用助手
实用程序函数并充分利用内部的context processors之类的东西
我的视图功能。

我希望我的回答是在您的问题范围内。

编辑:我只是注意到您对related_name的用法,我认为它错过了该选项的要点。请参见以下示例:

class Message(models.Model):
    sender   = models.ForeignKey(User, related_name='messages_sent')
    receiver = models.ForeignKey(User, related_name='messages_received')
    body     = models.Textfield()

使用上面的模型,我们可以做到这一点,这很容易理解:

u1 = User.objects.get(...)
received = u1.messages_received.all()

...并描述了这种关系的功能目的。所以related_name不是
仅用于具有唯一的相关名称。

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python-crontab模块 - python

我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…