Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 - Fatal编程技术网

Python Django多个相似模型

Python Django多个相似模型,python,django,Python,Django,我想在模型中重构一些代码,因为它有点乱。我有两个模特 class Part(models.Model): class Category(models.Model): class Labor(models.Model): 以此类推,总共七个。我正在为他们生成ID。部分为: def save(self, *args, **kwargs): if not Part.objects.count(): latest = 'XXX00000' else: l

我想在模型中重构一些代码,因为它有点乱。我有两个模特

class Part(models.Model):
class Category(models.Model):
class Labor(models.Model):
以此类推,总共七个。我正在为他们生成ID。部分为:

def save(self, *args, **kwargs):
    if not Part.objects.count():
        latest = 'XXX00000'
    else:
        latest = Part.objects.all().order_by('-par_id')[0].par_id
    self.par_id = "PAR" + str(int(latest[3:]) + 1).zfill(5)
    super(Part, self).save(*args, **kwargs)
其他班级的情况也很相似。只有类的名称在更改,三个字母标识和参数按顺序排列。我想知道我怎样才能把它弄干。因为每个类上有7行代码,应该以某种方式缩短

我想知道是否可以创建继承自它的BaseModel类,并以某种方式更改只提到的内容。我想知道一些如何才能做得更好的方向

编辑:


这是我的两个类。

继承绝对是个好主意

你没有提供太多关于模型的信息。因此,继承模型有两个主要选项:

A) 使用包含公共字段和一些公共方法的抽象模型。然后使用子模型根据需要扩展字段和方法。以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass
B) 如果您只对继承或扩展模型的行为部分感兴趣(如生成id的不同方法),那么代理模型将是更好的选择。请看以下文档:

以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

继承绝对是个好主意

你没有提供太多关于模型的信息。因此,继承模型有两个主要选项:

A) 使用包含公共字段和一些公共方法的抽象模型。然后使用子模型根据需要扩展字段和方法。以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass
B) 如果您只对继承或扩展模型的行为部分感兴趣(如生成id的不同方法),那么代理模型将是更好的选择。请看以下文档:

以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

继承绝对是个好主意

你没有提供太多关于模型的信息。因此,继承模型有两个主要选项:

A) 使用包含公共字段和一些公共方法的抽象模型。然后使用子模型根据需要扩展字段和方法。以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass
B) 如果您只对继承或扩展模型的行为部分感兴趣(如生成id的不同方法),那么代理模型将是更好的选择。请看以下文档:

以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

继承绝对是个好主意

你没有提供太多关于模型的信息。因此,继承模型有两个主要选项:

A) 使用包含公共字段和一些公共方法的抽象模型。然后使用子模型根据需要扩展字段和方法。以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass
B) 如果您只对继承或扩展模型的行为部分感兴趣(如生成id的不同方法),那么代理模型将是更好的选择。请看以下文档:

以下是django文档中的一个示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

创建
类基本模型(models.Model):
并将
保存
方法复制粘贴到此处,但将
部分
替换为
自身

class BaseModel(models.Model):
    # some fields here

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        first_declared_field = self.__class__._meta.fields[1].name

        if self.__class__.objects.count():
            latest = getattr(self.__class__.objects.order_by('-' + first_declared_field)[0], first_declared_field)
        else:
            latest = 'XXX00000'


        field_value = first_declared_field.name.split('_')[0].upper() + str(int(latest[3:]) + 1).zfill(5)
        setattr(self, first_declared_field, field_value) 

        super(BaseModel, self).save(*args, **kwargs)

class SomeChildModel(BaseModel):
    pass

创建
类基本模型(models.Model):
并将
保存
方法复制粘贴到此处,但将
部分
替换为
自身

class BaseModel(models.Model):
    # some fields here

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        first_declared_field = self.__class__._meta.fields[1].name

        if self.__class__.objects.count():
            latest = getattr(self.__class__.objects.order_by('-' + first_declared_field)[0], first_declared_field)
        else:
            latest = 'XXX00000'


        field_value = first_declared_field.name.split('_')[0].upper() + str(int(latest[3:]) + 1).zfill(5)
        setattr(self, first_declared_field, field_value) 

        super(BaseModel, self).save(*args, **kwargs)

class SomeChildModel(BaseModel):
    pass

创建
类基本模型(models.Model):
并将
保存
方法复制粘贴到此处,但将
部分
替换为
自身

class BaseModel(models.Model):
    # some fields here

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        first_declared_field = self.__class__._meta.fields[1].name

        if self.__class__.objects.count():
            latest = getattr(self.__class__.objects.order_by('-' + first_declared_field)[0], first_declared_field)
        else:
            latest = 'XXX00000'


        field_value = first_declared_field.name.split('_')[0].upper() + str(int(latest[3:]) + 1).zfill(5)
        setattr(self, first_declared_field, field_value) 

        super(BaseModel, self).save(*args, **kwargs)

class SomeChildModel(BaseModel):
    pass

创建
类基本模型(models.Model):
并将
保存
方法复制粘贴到此处,但将
部分
替换为
自身

class BaseModel(models.Model):
    # some fields here

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        first_declared_field = self.__class__._meta.fields[1].name

        if self.__class__.objects.count():
            latest = getattr(self.__class__.objects.order_by('-' + first_declared_field)[0], first_declared_field)
        else:
            latest = 'XXX00000'


        field_value = first_declared_field.name.split('_')[0].upper() + str(int(latest[3:]) + 1).zfill(5)
        setattr(self, first_declared_field, field_value) 

        super(BaseModel, self).save(*args, **kwargs)

class SomeChildModel(BaseModel):
    pass

我在我原来的帖子中添加了更多的信息。你的方法很适合,但有一点很小。对于每个类,我可以用我的数据更改kwargs,例如按顺序,因为它是字符串。如何将par\u id字段更改为另一个字段?您可以按字段在模型
self.\uu class\uuu.\uu meta.fields
中声明的顺序获取字段列表,但
self.\uu class\uuuuu.\uu meta.fields[0]
是id,所以您需要
..[1]
“par”或“CAT”,您可以像这样使用smth
self.\uu class\uuu meta.fields[1].name.split(''.[0].upper()
谢谢!这就是我要找的!我在我原来的帖子中添加了更多的信息。你的方法很适合,但有一点很小。对于每个类,我可以用我的数据更改kwargs,例如按顺序,因为它是字符串。如何将par\u id字段更改为另一个字段?您可以按字段在模型
self.\uu class\uuu.\uu meta.fields
中声明的顺序获取字段列表,但
self.\uu class\uuuuu.\uu meta.fields[0]
是id,所以您需要
..[1]
“par”或“CAT”,您可以像这样使用smth
self.\uu class\uuu meta.fields[1].name.split(''.[0].upper()
谢谢!这就是我要找的!我在我原来的帖子中添加了更多的信息。你的方法很适合,但有一点很小。对于每个类,我可以用我的数据更改kwargs,例如按顺序,因为它是字符串。如何将par\u id字段更改为另一个字段?您可以按字段在模型
self.\uu class\uuu.\uu meta.fields
中声明的顺序获取字段列表,但
self.\uu class\uuuuu.\uu meta.fields[0]
是id,所以您需要
..[1]
“par”或“CAT”,您可以像这样使用smth
self.\uu class\uuu meta.fields[1].name.split(''.[0].upper()
谢谢!这就是我要找的!我在我原来的帖子中添加了更多的信息。你的方法很适合,但有一点很小。对于每个类,我可以用我的数据更改kwargs,例如按顺序,因为它是字符串。如何将par_id字段更改为另一个?您可以按字段在模型
sel中声明的顺序获取字段列表