在Django 2.0 Mozilla tutorial中,当将各种fieldTypes定义为新模型的一部分时,有时会使用初始字符串参数。例如,他们使用以下代码段中的author变量(ForeignKey FieldType)和isbn(CharField)来完成此操作。
class Book(models.Model):
"""
Model representing a book (but not a specific copy of a book).
"""
title = models.CharField(max_length=200)
author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
# Foreign Key used because book can only have one author, but authors can have multiple books
# Author as a string rather than object because it hasn't been declared yet in the file.
summary = models.TextField(max_length=1000, help_text='Enter a brief description of the book')
isbn = models.CharField('ISBN',max_length=13, help_text='13 Character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>')
此字符串的用途是什么?我翻阅了Django Model Documentation,但找不到初始字符串参数作为选项。我假设它是用于数据库中列的值,但是使用可选参数 db_column 指定。任何见解均表示赞赏。谢谢。
答案 0 :(得分:1)
有两种方法指定ForeingKey
,其中一种是使用直接引用进行建模。在这种情况下,您的应用中应该有Author
个模型。
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
另一个正在使用字符串名称。在这种情况下,您以后可以在django中添加Author
模型。 Django不会给出错误。有时您想稍后创建另一个模型,但现在也想引用它。如果是这种情况,请使用String作为参数版本。
author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
现在,您可以创建Book
模型,而无需创建Author
模型。
对于ISBN
字段,此参数为verbose_name
。表中列的名称。如果您不指定django,则自动根据字段名称创建。在这种情况下,程序员希望数据库中的isbn
列为大写字母ISBN
。您可以在官方文档中找到有关verbose_name的更多详细信息。
答案 1 :(得分:1)
当我们研究这两个类的源代码(更具体地说,它们的__init__()
方法)((ForeignKey
和CharField
)时,我们会发现类似以下的内容
< br />
ForeignKey
class ForeignKey(ForeignObject):
....
....
def __init__(self, to, on_delete=None, related_name=None, related_query_name=None,
limit_choices_to=None, parent_link=False, to_field=None,
db_constraint=True, **kwargs):
# code
# code
CharField
此类是inherited from
Field`类,所以
class Field(RegisterLookupMixin):
...
...
... code
def __init__(self, verbose_name=None, name=None, primary_key=False,
max_length=None, unique=False, blank=False, null=False,
db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
serialize=True, unique_for_date=None, unique_for_month=None,
unique_for_year=None, choices=None, help_text='', db_column=None,
db_tablespace=None, auto_created=False, validators=(),
error_messages=None):
# code
# code
结论
类别的第一个参数在两个类别中都不同。 CharField
以verbose_name
作为第一个参数,而 ForeignKey
则以{{1 }}集合的模型将其作为第一个参数
CharField
source code Field
source code ForeignKey
source code