gpt4 book ai didi

python - 向 Django 模型添加代码和方法会破坏它

转载 作者:行者123 更新时间:2023-11-28 21:34:38 25 4
gpt4 key购买 nike

我有一个与此类似的 Django 模型:

class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.TextField(unique=False)

我想在 models.py 文件之外向某个人添加代码。所以我尝试导入它,继承它并添加代码:例如:

class MyPerson(db.Person):
def __init__(self, person_name):
super(MyPerson, self).__init__(name=person_name)

def print_person_info(self):
print(self.name)

我收到与此类似的错误:

运行时错误:模型类 db.persons.models.Person 未声明显式 app_label 并且不在 INSTALLED_APPS 中的应用程序中。

当然,在我的 settings.py 文件中,我确实将我的 persons 应用程序添加到了 INSTALLED_APPS

我想我可以直接在 models.py 中添加代码,但这似乎非常不方便,因为我想在那里添加更多代码,并且针对多个模型。

有什么想法吗?

一般来说可以/建议从模型继承吗?

最佳答案

I wanted to add code to a person, outside of the models.py file. So I tried to import it, inherit from it and add code.

如果您继承一个 Django 模型。 Django 将此视为一个额外的模型(继承)。因此,它必须在数据库端构造一个额外的表,该表具有对“父对象”的引用,并且在某些情况下,您需要指定这些额外的字段。但是由于您可能在 外部 models.py 定义了这个类,因此它找不到 app_label,因此,很多任务都可以不予执行。

Is it in general OK/Recommended to inherit from the model?

不,仅来自抽象模型,但这是除此处之外的另一个用例。从非抽象模型继承是可能的,但我仍然不建议这样做,因为它会在数据库级别造成很多额外的麻烦。

通常,如果您想要添加行为,可以直接在模型类执行此操作,例如:

class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.TextField(unique=False)

def print_person_info(self):
print(self.name)

或者如果行为与您已经定义的不同,您可以使用 proxy model [Django-doc]让两个模型类在同一个数据库表上工作,每个模型类都有自己的行为,例如:

class MyPerson(db.Person):

class Meta:
<b>proxy = True</b>

def print_person_info(self):
print(self.name)

但是代理也会带来很多额外的“复杂性”,因此建议仅将其用作“最后的手段”。

确实建议不要修补__init__函数,并且绝对不要通过更改参数(如果这样做,请使用*args) > 和 **kwargs 来传递所有参数),例如:

class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.TextField(unique=False)

def __init__(self, *args, **kwargs):
# ... (do something) ...
super(Person, self).__init__(*args, **kwargs)
# ... (do something) ...

def print_person_info(self):
print(self.name)

在 Django 中,许多类假设它们可以通过调用不带参数的构造函数或通过传递带有值的字段名称来创建模型实例。通过改变这种行为,需要重写很多类,以便您可以在表单、基于类的 View 等中使用模型。

关于python - 向 Django 模型添加代码和方法会破坏它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53081058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com