根据选择创建字段数

时间:2019-10-28 13:08:15

标签: django django-models

*我正在尝试根据先前的字段选择来确定如何在模型中填充字段。

例如,如果 FIELD_CHOICES = 3

创建3x TextField()

class Post(models.Model):
    STATUS_CHOICES = (('published','Published'),
                        ('draft','Draft '))
    FIELD_CHOICES = (('1','1 Title and body field'),
                    ('2','2 Title and body fields'),
                    ('3','3 Title and body fields'),
                    ('4', '4 Title and body fields'),
                    ('5', '5 Title and body fields'))

    author = models.ForeignKey(User,
                                on_delete=models.CASCADE,
                                related_name='blog_post')


    title = models.CharField(max_length=100)
    sub_title = models.TextField(max_length=50,default="")
    title_and_body_fields = models.IntegerField(choices=FIELD_CHOICES,
                                                default=1)

    **/// create number of title and body Textfields based on what was 
    /// selected in title_and_body_fields**


    created = models.DateField()
    publish = models.DateTimeField(default=timezone.now)
    slug = models.SlugField(max_length=250,
                            unique_for_date='created')

    status = models.CharField(max_length=250,
                    choices=STATUS_CHOICES,
                    default='draft')

    object = models.Manager()
    postManager = PostManager()


    class Meta():
        ordering = ('publish',)

    def __strd__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('my_blog:post_detail',
                        args=[self.publish.year,
                                self.publish.month,
                                self.publish.day,
                                self.slug])

最后,我决定执行以下操作。

我为Title和Body添加了5个单独的TextField,并添加blank = True

title_5 = models.CharField(max_length=100,null=True,blank=True)
    title_5_body = models.TextField(null=True,blank=True)

1 个答案:

答案 0 :(得分:1)

恐怕这是不可能的。

我认为您误解了模型的工作原理。看看模型here的Django文档。

Django基本保存模型的方法是通过ORM(Object-Relational-Mapping)

这意味着您编写的模型及其内部包含的字段将转换为数据库查询,从而生成表。

在模型文档中,您可以看到以下代码:

from django.db import models

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

转换为以下SQL查询:

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

这意味着Django在后台为您应用中具有的每个Model创建数据库表。


那么在Django中如何工作?

好吧,这些SQL语句是在您运行python manage.py makemigrations时生成的。实际的表是在运行python manage.py migrate时创建的。

这意味着您只运行一次这些命令(对于模型的每次更改),并且只会为模型创建一个表。


那我为什么不能向对象添加额外的TextField?

这是因为对于每个模型,数据库中只有一个表,并且您的模型将像这样存储:

id   |   first_name   |  last_name 
----------------------------------
1    |   John         |  Doe
2    |   Jane         |  Doe
...  |   ...          |  ...   

如果要向John Doe添加一个额外的字段(例如phone_number),则需要将该字段添加到整个表中。

因此,在您的情况下,您可以选择没有额外的正文和标题字段,或者为每个对象设置一定数量的额外字段。


好吧,现在怎么办?

嗯,有几种方法可以做到这一点。最好的选择是为一个名为PostBody之类的模型创建ManyToMany关系,这将使您可以为设置的帖子创建任意数量的正文。

您可以修改Post模型的保存方法,以自动为该对象创建一组PostBody个对象。

您可以阅读有关ManyToManyField here的更多信息。

相关问题