我爱编程

Django model

2018-04-12  本文已影响0人  粟米一粒

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')

继承

get vs filter

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

values_list vs values

上一篇 下一篇

猜你喜欢

热点阅读