码迷,mamicode.com
首页 > 其他好文 > 详细

ORM补充

时间:2019-07-30 23:20:54      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:details   ade   操作   eal   去重   data   lte   char   方式   

一、一对一

场景:字段多,且一部分字段使用率高

优点:提高效率

实质:唯一的外键

# 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补充

标签:details   ade   操作   eal   去重   data   lte   char   方式   

原文地址:https://www.cnblogs.com/wt7018/p/11273369.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!