无涯教程-Django - Models模型

87 阅读2分钟

模型(Models)是应用程序的数据访问层。默认情况下,每个django应用程序都会获取一个 models.py 文件来创建数据库表。 django框架中的默认数据库引擎是 sqlite3 。可以通过访问项目目录下的 settings.py 进行更改。 Django使用ORM(对象关系映射),使无涯教程能够执行数据库操作而无需编写SQL查询,而是使用简单的python对象。

from django.db import models

模型(models)是一个包含模型类,不同模型字段和字段关系的定义的模块。 要创建表,只需使一个类成为 Model 类的子类即可。

class MyClassname(models.Model): ...

模型字段

Django 2.2版提供26种不同的字段类型以捕获不同的数据格式。为简单起见根据函数而不是按字母顺序对它们进行了分组。

字段类型

  • AutoField
  • BigAutoField
  • UUIDField
  • IntegerField
  • PositiveIntegerField
  • SmallIntegerField
  • PositiveSmallIntegerField
  • BigIntegerField
  • DecimalField
  • FloatField
  • BinaryField
  • BooleanField
  • NullBooleanField
  • CharField
  • TextField
  • EmailField
  • SlugField
  • URLField
  • GenericIPAddressField
  • DateField
  • TimeField
  • DateTimeField
  • DurationField
  • FileField
  • FilePathField
  • ImageField

字段选项

Django字段类型中提供以下参数:

  • null
  • blank
  • choices
  • db_column
  • db_index
  • db_tablespace
  • default
  • editable
  • error_messages
  • help_text
  • primary_key
  • unique
  • unique_for_date
  • unique_for_month
  • unique_for_year
  • verbose_name
  • validators

字段关系

有时,业务逻辑需要不同模型类的属性之间的关系。在Django模型中,它们是三个字段关系: ForeignKey() OneToOneField() ManyToManyField()

Django外键

ForeignKey就像一对多的关系。它需要两个位置参数,即 Classname on_delete 类名是与模型相关的类。 on_delete = models.CASCADE 意味着删除Super类对象时,其所有反射也将被删除,因为ForeignKey也将被删除。例如,当删除以下模型中的Customer对象时,其相关的Order对象也将被删除。

    class Customer(models.Model):
        name = models.CharField(max_length=30)
        def __str__(self):
            return self.name
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Order</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    customer </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="typ">Customer</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
    order_details </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">TextField</span><span class="pun">()</span><span class="pln">
                            </span></pre>

Django OneToOneField 一对一

OneToOneField 与ForeignKey非常相似,不同的是,其外观类似于 unique = True 。 例如,如果一个人只能拥有一个国籍,则可以描述如下:

    class Person(models.Model):
        name = models.CharField(max_length=30)
        def __str__(self):
            return self.name
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Citizenship</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    person </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">OneToOneKey</span><span class="pun">(</span><span class="typ">Person</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
    country </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">30</span><span class="pun">)</span><span class="pln">
                            </span></pre>

Django ManyToManyField 多对多

多对多关系仅需要一个参数,即与模型相关的类。用下面的例子可以理解:

    class Person(models.Model):
        name = models.CharField(max_length=30)
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Group</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    name </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">128</span><span class="pun">)</span><span class="pln">
    members </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ManyToManyField</span><span class="pun">(</span><span class="pln">
        </span><span class="typ">Person</span><span class="pun">,</span><span class="pln">
        through</span><span class="pun">=</span><span class="str">Membership</span><span class="pun">,</span><span class="pln">
        through_fields</span><span class="pun">=(</span><span class="str">group</span><span class="pun">,</span><span class="pln"> </span><span class="str">person</span><span class="pun">),</span><span class="pln">
    </span><span class="pun">)</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Membership</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">group</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="typ">Group</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
    person </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="typ">Person</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
    inviter </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="pln">
        </span><span class="typ">Person</span><span class="pun">,</span><span class="pln">
        on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">,</span><span class="pln">
        related_name</span><span class="pun">=</span><span class="str">"membership_invites"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">)</span><span class="pln">
    invite_reason </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">64</span><span class="pun">)</span><span class="pln">
                            </span></pre>

参考链接

www.learnfk.com/django/djan…