首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将依赖项从一个应用程序注入到Django类中?

如何将依赖项从一个应用程序注入到Django类中?
EN

Stack Overflow用户
提问于 2021-02-24 17:36:49
回答 1查看 44关注 0票数 1

有没有一种干净的方法将依赖项从一个Django应用程序注入到另一个Django应用程序?

我有多个Django应用程序,其中一个是基础应用程序。这意味着,其他应用程序依赖于它,但基础应用程序不应该知道其他应用程序。在大多数情况下,这对于使用ForeignKeys和ManyToMany关系的依赖项与基础应用程序的模型来说不是问题。但是,在构建管理类时,为了将内联和链接添加到相应的依赖类,有必要在基础应用程序中指定这一点。可以直接从依赖的应用程序中注入吗?

EN

回答 1

Stack Overflow用户

发布于 2021-02-24 22:27:01

除了adding inlines的答案之外,我还必须为list disply和list filter向类添加属性。下面是为一个ForeignKey链接模型添加此链接的代码。Foo是一个父模型(在composition over inheritance的意义上),其他几个子模型通过其他应用程序中的OneToOne或ForeignKey字段链接到该父模型。这确保了父模型以及它所在的应用程序不依赖于它的子模型。

父App A中定义的模型和管理类。

代码语言:javascript
复制
# app_a/models.py
from django.db import models

class Foo(models.Model):
    name = models.CharField(max_length=64)
代码语言:javascript
复制
# app_a/admin.py
from django.contrib import admin
from .models import Foo

@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
    list_display = ["name"]
    list_display_links = ("name",)
    list_filter = []
    list_select_related = []

子App B中定义的模型和管理类。

代码语言:javascript
复制
# app_b/models.py
from django.db import models
from app_a.models import Foo

class BarComponent(models.Model):
    foo = models.OneToOneField(
        Foo,
        primary_key=True,
        related_name="bar_component",
        on_delete=models.CASCADE,
    )
    bar_type = models.CharField(max_length=42)
代码语言:javascript
复制
# app_b/admin.py
from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist

from .models import BarComponent
from app_a.admin import FooAdmin

@admin.register(BarComponent)
class BarAdmin(admin.ModelAdmin):
    pass

# Inject BarComponent aspect into admin for Foo
@mark_safe
def has_bar(self, obj):
    try:
        return '<a href="%s">%s</a>' % (
            reverse(
                "admin:appb_barcomponent_change",
                args=(obj.bar_component.pk,),
            ),
            obj.bar_component.bar_type,
        )
    except ObjectDoesNotExist:
        return "-"


setattr(FooAdmin, "has_bar", has_bar)
setattr(FooAdmin.has_bar, "allow_tags", True)
setattr(FooAdmin.has_bar, "short_description", "Bar")
FooAdmin.list_display.append("has_bar")
FooAdmin.list_filter.append(("bar_component", admin.EmptyFieldListFilter))
FooAdmin.list_select_related.append("bar_component")

免责声明:该代码是从我的项目中的功能代码中提取出来的。因此,它还没有经过测试,但是这个结构工作在my project上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66348187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档