Django model

manyTomany

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(person=ringo, group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason="Needed a new drummer.")
>>> m1.save()
>>> beatles.members.all()
[<Person: Ringo Starr>]
>>> ringo.group_set.all().order_by('membership__date_joined')
[<Group: The Beatles>]
>>> Group.objects.filter(members__name__startswith='Paul')
[<Group: The Beatles>]
>>> Person.objects.filter(
...     group__name='The Beatles',
...     membership__date_joined__gt=date(1961,1,1))
[<Person: Ringo Starr]
ringos_membership = ringo.membership_set.get(group=beatles)

oneTomany

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

>>> Entry.objects.filter(blog__name='Beatles Blog')
还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。
>>> Blog.objects.filter(entry__headline__contains='Lennon')

继承

  • 抽象基类: 这个model 不创建任何数据表,它的字段被加入子类中
  • 多表继承: 每个model 有专属的数据表,父类和子类通过oneToone来实现
  • 代理继承: 所有model 使用同一张表,每个model 可以添加不同的python 行为。

get vs filter

  • django 的 get 方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。
  • django 的 filter 方法是从数据库取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回 []。
  • 待验证
    filter 好像有缓存数据的功能,第一次查询数据库并生成缓存,下次再调用 filter 方法的话,直接取得缓存的数据,而 get 方法每次执行都是直接查询数据库的

null vs blank

在 python 检查中 blank = [None, '', [], {}, ()] 所以设置 null = True 必须blank = True
但是正常的save 是没有去验证这个blank 所以无论什么值都无所谓,如果需要验证blank 可以手动调用model.field_clean 或者full_clean.
如果需要验证 null = True , blank = False , 那么可以自己写clean 函数去验证字段,但是model 定义中还是需要写成null = True , blank = True

  • blank 为空字符串 默认 false
  • null 为null 默认 false

values_list vs values

  • values 返回字典
  • values_list 返回元组
    <code>
    Entry.objects.values_list('id', 'headline')
    [(1, 'First entry'), ...]
    Entry.objects.values_list('id', flat=True)
    [1,2,3]
    Blog.objects.values('id', 'name')
    [{'id': 1, 'name': 'Beatles Blog'}]
    <code>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查询集API 参...
    阳光小镇少爷阅读 9,259评论 0 8
  • ORM 映射关系:表名 <-------> 类名字段 <-------> 属性表记录 <------->类实例...
    lkning阅读 3,359评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,107评论 19 139
  • Django Model 定义语法 版本:1.7主要来源:https://docs.djangoproject.c...
    罗田阅读 31,139评论 2 42
  • 我一直在试图寻找一个更加理性的角度,用非常客观的态度去解读微商,但很可惜,恐怕很难做得到,因为微商这种生态夹杂着商...
    任凯晔阅读 2,695评论 0 1

友情链接更多精彩内容