回归顶部

我们都知道models.py文件是和数据库相关的,models.py文件里面储存的是数据,是建立网站的基石。对于如何写好models.py文件是我们学习过程中必不可少的。

字段类型

详细请查看:https://docs.djangoproject.com/en/3.1/ref/models/fields/

BooleanField

布尔类型。为一个复选框。

CharField

字符串,为文本输入框。

DateField

日期。有两个属性:auto_now和auto_now_add。设置auto_now=True即每次保存的时间。设置auto_now_add=True,即每次创建对象的时间。同时还可以设置为:

from django.utils import timezone

class Post(models.Model):
    publish = models.DateTimeField(default=timezone.now)

这样会显示日期表单框。

DateTimeField

同上。

FileField

必须要写一个参数upload_to,来指定保存文件的位置,使用方法如下:

class MyModel(models.Model):
    # file will be uploaded to MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # or...
    # file will be saved to MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

此时,必须要设置MEDIA_ROOT属性。

一般使用如下:

>>> f = open("../课程表.txt")
>>> from django.core.files import File
>>> myfile = File(f)
>>> from myapp.models import MyModel
>>> a = MyModel()
>>> a.upload = myfile
>>> a
<MyModel: MyModel object (None)>
>>> a.upload
<FieldFile: ../课程表.txt>
>>> a.upload.url
'%E8%AF%BE%E7%A8%8B%E8%A1%A8.txt'

一般调用它的url属性来返回图片资源的指定位置。

文件还有个写法(最新发现的):

from django.db import models

def user_directory_path(instance, filename):  # instance : 实例对象。filename:文件名
    file_name = instance.username + '_pic.' + filename.split(".")[-1]
    return 'media/user_{}/{}'.format(instance.username, file_name)

class User(models.Model):
    username = models.CharField(max_length=20, verbose_name="用户名")
    password = models.CharField(max_length=20, verbose_name="密码")
    pic = models.FileField(upload_to=user_directory_path)

    def __str__(self):
        return self.username

ImageField

和FileField差不多,就是多了两个参数,一个是height_field,还有一个是width_field。用于指定图片的宽和高。不过使用ImageField字段需要安装有pillow库。

IntegerField

整数类型。

TextField

文本类型。

URLField

url类型。

ForeignKey

用法如下:

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE, related_name="car")
    # ...

class Manufacturer(models.Model):
    # ...
    pass

第一个参数是多对一关联的类,第二个参数是删除后的方式,第三个参数是反向关联。

OneToOneField

和ForeignKey类似。

ManyToManyField

编辑models.py文件为:

from django.db import models

class People(models.Model):
    CHOICES = (("men", "男"), ("women", "女"))
    name = models.CharField(max_length=20)
    grade = models.CharField(choices=CHOICES, max_length=20)

class Hobby(models.Model):
    person = models.ManyToManyField("People", related_name="hobby")

然后两者分别创建一个对象:

>>> from myapp.models import People, Hobby
>>> a = People.objects.create(name="catfish", grade="men")
>>> b = Hobby().save()
>>> b.person.add(a)       # 把a关联到b
>>> b.person.remove(a)     # 移除ab之间的关联

字段选项

详细请查看:https://docs.djangoproject.com/en/3.1/ref/models/fields/

我这里只写一些常用的。

null

数据库中该值是否能为空值,默认为false。

blank

表单验证中是否为空值,默认为false。

choices

枚举类型,小括号内第一个为机器可读语言,第二个为人类可读语言。使用如下:

from django.db import models

class People(models.Model):
    CHOICES = (("men", "男"), ("women", "女"))
    name = models.CharField(max_length=20)
    grade = models.CharField(choices=CHOICES, max_length=20)

default

设置默认值。

help_text

后台表单的提示文本,支持html代码。

primary_key

主键。设置primary_key=True来指定主键,如果不指定django默认有个id为主键。

unique

是否是唯一的,默认False。

verbose_name

汉化后台。

validators

用于添加自定义验证,先定义一个自定义验证的函数:

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

def validate_even(value):
    if value % 2 != 0:
        raise ValidationError(
            _('%(value)s is not an even number'),
            params={'value': value},
        )

使用方法如下:

from django.db import models

class MyModel(models.Model):
    even_field = models.IntegerField(validators=[validate_even])

Meta选项

verbose_name

汉化表名

verbose_name_plural

汉化表名

ordering

排序规则

处理objects对象

重写objects内置方法

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status='published')

class Article(models.Model):
    published = PublishedManager()

自定义objects方法

class BookManager(models.Manager):
    def create_book(self, title):
        book = self.create(title=title)
        # do something with the book
        return book

class Book(models.Model):
    title = models.CharField(max_length=100)
    objects = BookManager()

book = Book.objects.create_book("Pride and Prejudice")

自定义的模型方法

就是自己写一个带有返回值的模型方法,还可以使用修饰器。

内置可调用的模型方法

delete

save

重写的模型方法

clean

from django.core.exceptions import ValidationError

def clean(self):
    if self.comment_type == 0 and len(self.content)== 0 :
        raise ValidationError(u'评论不能为空')

__str__

get_absolute_url

def get_absolute_url(self):
    return "/people/%i/" % self.id

一般与reverse方法一起使用:

def get_absolute_url(self):
    from django.urls import reverse
    return reverse('people.views.details', args=[str(self.id)])

save

def save(self, *args, **kwargs):
        # do_something()
        super().save(*args, **kwargs)  # Call the "real" save() method.
        # do_something_else()

有些是models里面的自带方法,有些是objects里面自带的方法

文章留言

1. 您可以在您喜欢的文章下面留言

2. 留言不会立即显示,留言会经过博主同意才能显示

3. 博主同意后可能对您的评论进行回复,所以请填写QQ号码从QQ邮箱中第一时间收到消息

4. 如果评论了没有显示“操作成功”请联系我,谢谢!(致敬)

昵称: QQ:

留言列表


暂无人留言

文章目录


    相关文章


    前言:Django的学习

    如何写好models.py文件

    如何写好admin.py文件