from django.db import modelsclass Person(models.Model):#models是module,CharField是class first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
#多对一:ForeignKey类from django.db import modelsclass Manufacturer(models.Model): # ... passclass Car(models.Model): manufacturer = models.ForeignKey(Manufacturer) # ...
#多对多:ManyToManyField class,在Topping或者Pizza中定义均可from django.db import modelsclass Topping(models.Model): # ... passclass Pizza(models.Model): # ... toppings = models.ManyToManyField(Topping)
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=128) def __str__(self): return self.nameclass Group(models.Model): name = models.CharField(max_length=128) #through参数指向的就是intermediate class members = models.ManyToManyField(Person, through='Membership') def __str__(self): return self.nameclass Membership(models.Model): person = models.ForeignKey(Person) group = models.ForeignKey(Group) #可以指定其他field 描述两者之间的关系 date_joined = models.DateField() invite_reason = models.CharField(max_length=64)
from django.db import modelsclass Ox(models.Model): horn_length = models.IntegerField() class Meta: #排序字段 ordering = ["horn_length"] verbose_name_plural = "oxen" #指定存放model的database table db_table="myOx"
from django.db import modelsclass Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def save(self, *args, **kwargs): do_something() #调用基类方法 super(Blog, self).save(*args, **kwargs) # Call the "real" save() method. do_something_else()
#两者效果一样Person.objects.raw('SELECT * FROM myapp_person')Person.objects.all()
from django.db import modelsclass CommonInfo(models.Model): # ... class Meta: abstract = True ordering = ['name']class Student(CommonInfo): # django会自定把abstract设为false,所以Student不是抽象类 class Meta(CommonInfo.Meta): db_table = 'student_info'
from django.db import modelsclass Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80)class Restaurant(Place): serves_hot_dogs = models.BooleanField(default=False) serves_pizza = models.BooleanField(default=False)class Supplier(Place): #需要显示指定related_name参数 customers = models.ManyToManyField(Place,related_name='provider')
from django.db import modelsclass Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): return self.nameclass Entry(models.Model): #blog 是related object blog = models.ForeignKey(Blog) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() def __str__(self): return self.headlineb = Blog.objects.get(id=1)b.entry_set.all() # Returns all Entry objects related to Blog.# b.entry_set is a Manager that returns QuerySets.b.entry_set.filter(headline__contains='Lennon')b.entry_set.count()
from django.db import modelsclass Base(models.Model): m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related") class Meta: abstract = Trueclass ChildA(Base): passclass ChildB(Base): pass#如果related_name指定了固定名字如"refer",那么m2m.refer无法确定是引用ChildA还是ChildB,如果
#Base类中隐式指定related_name,则不会有错误,ChildA中的related_name默认为childa_set,ChildB中
#related_name默认为childb_set
from django.db import modelsclass Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)class MyPerson(Person): class Meta: #定义proxy model的方法 proxy = True ordering = ["last_name"] def do_something(self): # ... pass #可以在proxy model中访问original model实例,反之亦然 p = Person.objects.create(first_name="foobar") MyPerson.objects.get(first_name="foobar")
新闻热点
疑难解答