Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向Django模型添加代码和方法会破坏它_Python_Django_Python 3.x_Model - Fatal编程技术网

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

Python 向Django模型添加代码和方法会破坏它,python,django,python-3.x,model,Python,Django,Python 3.x,Model,我有一个类似于此的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): de

我有一个类似于此的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未声明显式的应用程序\u标签,并且不在已安装的\u应用程序中的应用程序中

当然,在我的
settings.py
文件中,我会将我的
persons
应用程序添加到已安装的应用程序中

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

有什么想法吗

通常可以/建议从模型继承吗

我想在models.py文件之外为个人添加代码。所以我尝试导入它,从中继承并添加代码

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

通常可以/建议从模型继承吗

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

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

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)
或者,如果行为与您已经定义的行为不同,您可以使用,让两个模型类在同一个数据库表上工作,每个模型类的行为如下:

class MyPerson(db.Person):

    class Meta:
        proxy = True

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

在Django中,许多类都假设它们可以通过调用无参数的构造函数或通过传递带值的字段名来生成模型实例。通过改变这种行为,需要重写大量的类,以便在表单、基于类的视图等中使用模型。

这是因为Django在内部使用构造函数来构造新对象(在表单等中)。最好不要修补
\uuuu init\uuuu
函数,它已经支持参数。这确实是一种错误的方法。如果要向模型添加代码,请在模型中执行此操作。如果您只想对模型执行操作,则无需向模型中添加代码。在这两种情况下,子类化都不是正确的做法。
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)