*我正在尝试根据先前的字段选择来确定如何在模型中填充字段。
例如,如果 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)
答案 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的更多信息。