ForeignKey ManyToManyField 中related_name使用 及models 中clean方法


 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'評論不能為空')
這樣就規定了如果回復類型是評論的話 必須要有內容 否則后台就會報錯。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM