1 # -*- coding:utf-8 -*- 2 from django.db import models 3 from django.contrib.auth.models import User 4 from django.core.exceptions import ValidationError 5 # Create your models here. 6 7 class UserProfile(models.Model): 8 user = models.OneToOneField(User,unique=True) 9 name = models.CharField(max_length=32,verbose_name=u'昵稱') 10 age = models.SmallIntegerField(verbose_name=u'年齡',default=0) 11 sex_type = {(0,u'男'), 12 (1,u'女') 13 } 14 sex =models.IntegerField(choices=sex_type,default=0,) 15 signature = models.CharField(max_length=128,verbose_name=u'個性簽名',blank=True,null=True) 16 def __str__(self): 17 return self.name 18 19 class Article(models.Model): 20 title = models.CharField(max_length=255,verbose_name=u'標題') 21 content = models.TextField(verbose_name=u'內容') 22 author = models.ForeignKey("UserProfile",verbose_name=u'作者') 23 published_data = models.DateTimeField(auto_now_add= True,verbose_name=u'發布時間') 24 modify_data = models.DateTimeField(auto_now = True,verbose_name=u'更新時間') 25 art_img = models.ImageField(width_field=150,height_field=150,upload_to="uploads",blank=True,null=True) 26 category = models.ForeignKey("Category",verbose_name=u'所屬欄目',related_name='myarticle') 27 def __str__(self): 28 return self.title 29 30 31 class Category(models.Model): 32 name = models.CharField(max_length=32,verbose_name=u'欄目名稱') 33 brief = models.CharField(null=True, blank=True, max_length=255,verbose_name=u'欄目簡介') 34 set_as_top_menu = models.BooleanField(default=False) 35 position_index = models.SmallIntegerField() 36 url_name = models.CharField(max_length=32,verbose_name=u'欄目網址') 37 def __str__(self): 38 return self.name 39 class Meta: 40 verbose_name = u'欄目' 41 verbose_name_plural = u'欄目' 42 43 class Comment(models.Model): 44 content = models.CharField(max_length=255,verbose_name=u'評論內容',blank=True,null=True) 45 author = models.ForeignKey('UserProfile',related_name='mycomment'verbose_name=u'評論人') 46 data = models.DateTimeField(auto_now_add=True,verbose_name=u'評論時間') 47 article = models.ForeignKey("Article",verbose_name=u'所屬文章') 48 parent_comment = models.ForeignKey('self',related_name='son_comment',verbose_name=u'上級評論',blank=True,null=True) 49 comment_type_choice = { 50 (0,u'評論'), 51 (1,u'點贊') 52 } 53 comment_type = models.IntegerField(choices=comment_type_choice,default=0,verbose_name=u'評論類型') 54 def __str__(self): 55 return self.content 56 def clean(self): 57 if self.comment_type == 0 and len(self.content)== 0 : 58 raise ValidationError(u'評論不能為空')
ForeignKey ManyToManyField 中 related_name 可加可不加,但是一個字段里有多個ForeignKey 指向同一個字段,則必須添加related_name來區分。以上面代碼為例:
在字段里Article里可通過category屬性來查詢所屬欄目:
article_obj = models.Article.objects.get(id=1) #取id為1的文章
article_obj.category 查出所屬欄目
but,如何通過欄目來查出這個欄目下所有的文章呢?
category_obj = models.Category.objects.get(id=1) #取ido為1的欄目
category_obj.myarticle.all()或者category_obj.myarticle.select_related()來查出欄目1下的所有文章。
,如果Article字段屬性category沒有添加related_name,可通過model_name+'_set'這種訪問方式,使用方法如下:
category_obj.article_set.all() 或者 category_obj.article_set.select_related()
另外 ForeignKey ManyToManyField 對象可以是字段本身,使用方法為:
parent_comment = models.ForeignKey('self',related_name='son_comment',verbose_name=u'上級評論',blank=True,null=True)
models中clean方法的使用:
from django.core.exceptions import ValidationError
def clean(self): if self.comment_type == 0 and len(self.content)== 0 : raise ValidationError(u'評論不能為空')
這樣就規定了如果回復類型是評論的話 必須要有內容 否則后台就會報錯。