ORM补充
Posted wt7018
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM补充相关的知识,希望对你有一定的参考价值。
一、一对一
场景:字段多,且一部分字段使用率高
优点:提高效率
实质:唯一的外键
# Person表 class Person(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16, null=False, unique=True) sex = models.CharField(max_length=8, null=False) # Django2.0 要添加on_delete details = models.OneToOneField(to="PersonDetails", on_delete=models.CASCADE) # PersonDetails class PersonDetails(models.Model): hobby = models.CharField(max_length=32, null=False) addr = models.CharField(max_length=64, null=False)
# 正向字段查找 ret = models.Person.objects.filter(id=1).values_list(‘details__hobby‘) print(ret) # 反向字段查找 ret = models.PersonDetails.objects.filter(addr="徐州").values("person__name") print(ret)
二、多对多创建的方式
1、ManyToManyField,自动创建第三张表
优点:简单、方便
缺点:不能在第三张表添加额外的字段
2、自己创建第三张表,利用外键分别关联
缺点:麻烦、并且不能使用ORM的内置方法,所有一般不用这种方法
3、ManyToManyField,指定第三张表
优点:查询方便,第三张表可以自定义字段
缺点:第三张表自定义字段后,无法使用create、add、set等方法,需要通过第三张表直接操作
# 书 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=16, null=False, unique=True) price = models.DecimalField(max_digits=4, decimal_places=2) # 作者 class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=8, null=False, unique=True) books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book")) # 作者to书 class Author2Book(models.Model): id = models.AutoField(primary_key=True) author = models.ForeignKey(to="Author", on_delete=models.CASCADE) book = models.ForeignKey(to="Book", on_delete=models.CASCADE) data = models.DateField(auto_now_add=True) class Meta: # 作者和书设置联和唯一 unique_together = ("author", "book")
# 正向 字段查询 ret = models.Author.objects.filter(id__gt=1).values("books__title", "books__price") print(ret) print(‘去重‘.center(80, ‘-‘)) print(ret.distinct()) # 反向 字段查找 ret = models.Book.objects.filter(id=1).values_list("author__name") print(ret)
三、csrf的简单用法
csrf (Cross-site request forgery)跨站请求伪造
实质:添加一个动态隐藏标签,提交的时候网站要做比较
在form表单中添加:
% csrf_token %
return render(request, "real.html")
request, 每次返回一个新值 去改变csrf_token
以上是关于ORM补充的主要内容,如果未能解决你的问题,请参考以下文章