Django FieldType默认字符串参数的用途

时间:2018-07-15 23:45:45

标签: django

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 指定。任何见解均表示赞赏。谢谢。

2 个答案:

答案 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__()方法)((ForeignKeyCharField)时,我们会发现类似以下的内容
< 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 }}集合的模型将其作为第一个参数

资源

  1. CharField source code
  2. Field source code
  3. ForeignKey source code

    希望这能清除您的疑问:)