小编pho*_*ley的帖子

Django中的抽象模型和外键

我正在开发一个django项目,我在其中创建了一组三个抽象模型,稍后我将用于各种应用程序.我遇到的问题是我想通过ForeignKey连接这些模型但django告诉我它不能将foreignkeys分配给抽象模型.

我目前的解决方案是在我在其他应用程序中实现该类时指定外键.但是,我正在为抽象类(书和页)编写一个管理器,并且需要访问这些外键.我基本上要做的是以无状态的方式获得一本书所具有的单词数量,因此不将其存储在页面或书籍的字段中.

该模型看起来类似于:

class Book(models.Models):
    name = models.CharField(...)
    author = models.CharField(...)
    ...

    class Meta:
        abstract = True

class Page(models.Models):
    book = models.ForeignKey(Book)
    chapter = models.CharField(...)
    ...

    class Meta:
        abstract = True

class Word(models.Models):
    page = models.ForeignKey(Page)
    line = models.IntegerField(...)
    ...

    class Meta:
        abstract = True
Run Code Online (Sandbox Code Playgroud)

请注意,此处的模型只是为了举例说明我要做的事情,因此不需要从实现的角度来看这个模型(Book-Page-Word)是否有意义.

abstract-class foreign-keys django-models

11
推荐指数
2
解决办法
8550
查看次数

使用 Zeitwerk 自动加载器在 Rails 6 中命名服务对象

Rails 6 改用 Zeitwerk 作为默认自动加载器。Zeitwerk 将加载 /app 文件夹中的所有文件,从而无需命名空间。这意味着,现在可以直接调用 app/services/demo/test_service.rb 中的 TestService 服务对象,例如TestService.new().call

然而,命名空间有助于组织更复杂的 Rails 应用程序中的对象,例如API::UsersController,或者对于我们使用 Registration::CreateAccount、Registration::AddDemoData 等的服务。

Rails 指南建议的一种解决方案是从 application.rb 中的自动加载器路径中删除路径,例如config.autoload_paths -= Dir["#{config.root}/app/services/demo/"]。然而,这感觉就像是一个猴子补丁,用于硬塞旧的方式或将对象组织到新的轨道方式中。

命名对象的正确方法是什么,或者 Rails 6 组织对象的正确方法是什么,而不仅仅是强制 Rails 采用旧方法?

namespaces ruby-on-rails ruby-on-rails-6 zeitwerk

4
推荐指数
1
解决办法
2371
查看次数