Django代理模型有什么缺点吗?

Django代理模型有什么缺点吗?,django,django-models,Django,Django Models,在寻找模型的实际数据库结构时,我已经厌倦了在许多不相关的小属性之间进行分页。普遍使用代理模型只是为了让代码更好地组织/更具可读性,这是一件坏事吗?即 class Foo_Base( models.Model): title = models.CharField( ...) # other DB fields. As little as possible anything else. class Bar_Base( models.Model): foo = models.F

在寻找模型的实际数据库结构时,我已经厌倦了在许多不相关的小属性之间进行分页。普遍使用代理模型只是为了让代码更好地组织/更具可读性,这是一件坏事吗?即

class Foo_Base( models.Model):
    title = models.CharField( ...)
    # other DB fields. As little as possible anything else.
class Bar_Base( models.Model):
    foo = models.ForeignKey( Foo_Base, ... )
等等。DB表中的行数不超过列数。然后在底部或其他地方

class Foo( Foo_Base):
    class Meta:
        proxy=True

    @property
    def some_pseudo_field(self):
        # compute something based on the DB fields in Foo_Base
        return result
    @property
    # etc. pages of etc.
makemigrations
migrate
跟踪代理模型的事实让我有点担心,尽管这种用法似乎正是Django文档所说的(将额外的功能包装在同一个数据库表中)

或者是否有其他方法来组织我的代码,以实现同样的效果(将基本的东西和细微的支持位分开)

[编辑]我在下面提供了一些似乎可以作为自我回答的东西。我仍然非常希望听到任何知道这一点的人的声音,因为它的声明性字段声明具有深刻的Django魔力


(关于Python,我唯一不喜欢的是它没有
include
功能来读取另一个文件中的一堆代码!)

我想我可能已经找到了一个答案:使用从
对象继承的插件类,
这在基于类的视图中很常见

我仍然非常希望听到任何知道这一点的人的声音,因为它的声明性字段声明具有深刻的Django魔力

最低限度的概念证明:

class PenMethods1( object):
    @property
    def namey(self):
        return format_html('<div class="namey">{name}</div>', name=self.name )

class PenTest1(PenMethods1, models.Model):
    name = models.CharField( max_length=16, blank=True )
    def __repr__(self):
       return f'<Pentest1 object id={self.id} name={self.name}>'
Pennum
是我的游戏笔中已经存在的东西)并运行
makemigrations
migrate
。再次确认,基本功能正常

>>> from playpen.models import PenTest1, Pennum
>>> n = Pennum.objects.last()
>>> n
<Pennum object id=3 name="t3" num=14 >
>>> p = PenTest1.objects.get(name='bar')
>>> p
<Pentest1 object id=2 name=bar>
>>> p.namey
'<div class="namey">bar</div>'
>>> p.pnum=n
>>> p.save()
>>> n=Pennum.objects.last()
>>> list(n.pentest1_set.all())
[<Pentest1 object id=2 name=bar>]
>>> 
>>从playpen.models导入PenTest1,Pennum
>>>n=Pennum.objects.last()
>>>n
>>>p=PenTest1.objects.get(name='bar')
>>>p
>>>p.namey
“酒吧”
>>>p.pnum=n
>>>p.save()
>>>n=Pennum.objects.last()
>>>列表(n.pentest1_set.all())
[]
>>> 

我想我可能已经找到了答案:使用继承自
对象的插件类,
这在基于类的视图中很常见

我仍然非常希望听到任何知道这一点的人的声音,因为它的声明性字段声明具有深刻的Django魔力

最低限度的概念证明:

class PenMethods1( object):
    @property
    def namey(self):
        return format_html('<div class="namey">{name}</div>', name=self.name )

class PenTest1(PenMethods1, models.Model):
    name = models.CharField( max_length=16, blank=True )
    def __repr__(self):
       return f'<Pentest1 object id={self.id} name={self.name}>'
Pennum
是我的游戏笔中已经存在的东西)并运行
makemigrations
migrate
。再次确认,基本功能正常

>>> from playpen.models import PenTest1, Pennum
>>> n = Pennum.objects.last()
>>> n
<Pennum object id=3 name="t3" num=14 >
>>> p = PenTest1.objects.get(name='bar')
>>> p
<Pentest1 object id=2 name=bar>
>>> p.namey
'<div class="namey">bar</div>'
>>> p.pnum=n
>>> p.save()
>>> n=Pennum.objects.last()
>>> list(n.pentest1_set.all())
[<Pentest1 object id=2 name=bar>]
>>> 
>>从playpen.models导入PenTest1,Pennum
>>>n=Pennum.objects.last()
>>>n
>>>p=PenTest1.objects.get(name='bar')
>>>p
>>>p.namey
“酒吧”
>>>p.pnum=n
>>>p.save()
>>>n=Pennum.objects.last()
>>>列表(n.pentest1_set.all())
[]
>>> 

您打算在基和代理之间建立1:1的关系吗?@grrrr是的(希望我在grrrr中正确地计算了r);)在我看来,这似乎偏离了代理模型实现美学目标的技术意图。考虑到这一点,尽管它可能会起作用,但它可能会混淆其他开发人员或增加未来的技术债务。就个人而言,我将考虑(自定义)代码折叠来隐藏字段/属性/方法。instead@grrrrrr提供我自己实验确定的答案。有什么想法吗?你打算在基础和代理之间建立1:1的关系吗?@grrrrrr是的(希望我在grrrr中正确地计算了r);)在我看来,这似乎偏离了代理模型实现美学目标的技术意图。考虑到这一点,尽管它可能会起作用,但它可能会混淆其他开发人员或增加未来的技术债务。就个人而言,我将考虑(自定义)代码折叠来隐藏字段/属性/方法。instead@grrrrrr提供我自己实验确定的答案。有什么想法吗?这似乎有点骇人听闻,因为我在Django文档中没有看到任何这样的例子。如果你想让它像这样出现,你应该使用抽象基础模型或代理模型。另一方面,它是标准的Python,没有明显的Django含义。但是,在添加了这样的模型之后,您无法以完全直接的方式删除它,因为初始迁移记录插件类,如果插件类消失,后续迁移将失败,即使您删除了插件插入的模型。您可以将其存根到单个
pass
语句中。@grrrrrr抽象基类可以从另一个抽象基类继承吗?否则,那就没用了。这似乎有点骇人,因为我在Django文档中没有看到任何这样的例子。如果你想让它像这样出现,你应该使用抽象基础模型或代理模型。另一方面,它是标准的Python,没有明显的Django含义。但是,在添加了这样的模型之后,您无法以完全直接的方式删除它,因为初始迁移记录插件类,如果插件类消失,后续迁移将失败,即使您删除了插件插入的模型。您可以将其存根到单个
pass
语句中。@grrrrrr抽象基类可以从另一个抽象基类继承吗?否则,这没有帮助。