插入函数
django编写网页时采用MTV模式(model-Template-Veiw)
1.unicode()
请确保你的每一个模型里都包含 unicode() 方法,这不只是为了交互时方便,也是因为 Django会在其他一些地方用 unicode() 来显示对象。
没有的话:
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]
有的话:
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Apress>, <Publisher: O'Reilly>]
unicode() 方法可以进行任何处理来返回对一个对象的字符串表示。Publisher对象的unicode()方法简单地返回名称name。
对unicode()的唯一要求就是它要返回一个unicode对象 如果__unicode__()
方法未返回一个Unicode对象,而返回比如说一个整型数字,那么Python将抛出一个TypeError
错误,并提示:”coercing to Unicode: need string or buffer, int found” 。
2.str()
是Python的一个”魔幻“方法,这个方法定义了当object调用str()时应该返回的值。Django在许多地方使用str(obj)(或者相关方法,unicode(obj)——见下文),比如说在Django管理站点加载一个对象时显示它的值或者作为对象的显示值插入模板中。因此,我们应该总是返回一个友好的,用户可读的字符串作为对象的str。尽管这不是必须的,但还是建议这么做。例如:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def __str__(self):
# Note use of django.utils.encoding.smart_str() here because
# first_name and last_name will be unicode strings.
return smart_str('%s %s' % (self.first_name, self.last_name)
unicode()方法是在一个对象上调用unicode()时被调用的。因为Django的数据库后端会返回Unicode字符串给model属性,所以我们通常会给自己的model写一个unicode()方法。(就是说的unicode方法)
- url反向解析: reverse()
def get_absolute_url(self):
return reverse('app01:article', args=(self.slug,)) #reverse的第一个参数是urls.py的url中的app名称:name
关于get_absolute_url()和reverse()的介绍:
http://www.cnblogs.com/wswang/p/5523510.html
经验
1.django模型中auto_now和auto_now_add的区别
auto_now无论是你添加还是修改对象,时间为你添加或者修改的时间。
auto_now_add为添加时的时间,更新对象时不会有变动。
示例:
class Blog(models.Model):
...
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
2.一般我们在models.py中写的类,如果不指定主键id的话,会自动生成。
如果指定了,那么需要注意两点。
class Host(models.Model):
nid = models.AutoField(primary_key=True)
注意:
1)使用AutoField()
2)需要添加参数primary_key
3.IP的字段GenericIPAddressField
ip = models.GenericIPAddressField()
参数有:
protocal # both: 支持ipv4与ipv6,如果ipv4,那么就不支持ipv6
一般的字段,不传null=True的话,都是非空字段。
hostname = models.CharField(max_length=32)
3.models排序的设置
两种方法:
1)查找的时候
注意:-
是包含在双引号之内的。
queryset = models.Post.objects.all().order_by("-id") # 根据id倒序
2)models中设置
在对应的需倒序的类中添加:
class Meta:
ordering = ["-id"]
4.使用_set
查找第二层:
addressRegions = models.AddressRegion.objects.all()
for ar in addressRegions:
ar.availablearea_set.all()
5.QuerySet切片
MyModel.objects.all()[:10] 这个 [:10]是设么意思啊?
从第0个开始取,取到10结束。 而不是取出所有,然后再切。
6.Django model,QuerySet 序列化成json的方法
http://blog.csdn.net/woohyuknrg/article/details/17140531
7.级联删除,级联更新
class Album(models.Model):
artist = models.CharField(max_length=16)
album_title = models.CharField(max_length=8)
album_logo = models.CharField(max_length=512)
class Song(models.Model):
album = models.ForeignKey(Album, on_delete=models.CASCADE, on_update=models.CASCADE)
on update cascade是级联更新的意思,on delete cascade是级联删除的意思,意思就是说当你更新或删除主键表,那外见表也会跟随一起更新或删除
肯定不行的,必须定义了级联删除可以的,不同的级联方式实现的效果是不一样的
8.新建model的时候,最好将str和unicode加上:
class Album(models.Model):
artist = models.CharField(max_length=16)
album_title = models.CharField(max_length=8)
album_logo = models.CharField(max_length=512)
def __str__(self):
return self.album_title
def __unicode__(self):
return self.album_title
注意:str和unicode中返回的album_title字段不能是null=True的。
9.filter的时候,字段可以包含,非大小写包含,以..开始,以..结束等。
c=Teacher.object.filter(name__contains="ou") #类似的还有name__icontains name__startswith name__endswith range等
10.filter和get的区别:
album = Album.objects.get(pk=1) # 得到 <Album: Red> 实例
album = Album.objects.filter(pk=1) # 得到queryset: <QuerySet [<Album: Red>]>
models.py分析
from __future__ import unicode_literals
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.db import models
from django.db.models.signals import pre_save
from django.utils import timezone
from django.utils.safestring import mark_safe
from django.utils.text import slugify
from markdown_deux import markdown
from comments.models import Comment
from .utils import get_read_time
# Create your models here.
# MVC MODEL VIEW CONTROLLER
#Post.objects.all()
#Post.objects.create(user=user, title="Some time")
class PostManager(models.Manager):
def active(self, *args, **kwargs):
# Post.objects.all() = super(PostManager, self).all()
return super(PostManager, self).filter(draft=False).filter(publish__lte=timezone.now())
def upload_location(instance, filename):
#filebase, extension = filename.split(".")
#return "%s/%s.%s" %(instance.id, instance.id, extension)
PostModel = instance.__class__
new_id = PostModel.objects.order_by("id").last().id + 1
"""
instance.__class__ gets the model Post. We must use this method because the model is defined below.
Then create a queryset ordered by the "id"s of each object,
Then we get the last object in the queryset with `.last()`
Which will give us the most recently created Model instance
We add 1 to it, so we get what should be the same id as the the post we are creating.
"""
return "%s/%s" %(new_id, filename)
class Post(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
title = models.CharField(max_length=120)
slug = models.SlugField(unique=True)
image = models.ImageField(upload_to=upload_location,
null=True,
blank=True,
width_field="width_field",
height_field="height_field")
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
content = models.TextField()
draft = models.BooleanField(default=False)
publish = models.DateField(auto_now=False, auto_now_add=False)
read_time = models.IntegerField(default=0) # models.TimeField(null=True, blank=True) #assume minutes
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
objects = PostManager()
def __unicode__(self):
return self.title
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("posts:detail", kwargs={"slug": self.slug})
def get_api_url(self):
return reverse("posts-api:detail", kwargs={"slug": self.slug})
class Meta:
ordering = ["-timestamp", "-updated"]
def get_markdown(self):
content = self.content
markdown_text = markdown(content)
return mark_safe(markdown_text)
@property
def comments(self):
instance = self
qs = Comment.objects.filter_by_instance(instance)
return qs
@property
def get_content_type(self):
instance = self
content_type = ContentType.objects.get_for_model(instance.__class__)
return content_type
def create_slug(instance, new_slug=None):
slug = slugify(instance.title)
if new_slug is not None:
slug = new_slug
qs = Post.objects.filter(slug=slug).order_by("-id")
exists = qs.exists()
if exists:
new_slug = "%s-%s" %(slug, qs.first().id)
return create_slug(instance, new_slug=new_slug)
return slug
def pre_save_post_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
if instance.content:
html_string = instance.get_markdown()
read_time_var = get_read_time(html_string)
instance.read_time = read_time_var
pre_save.connect(pre_save_post_receiver, sender=Post)
方法:def get_api_url()
在其他的地方可以使用到,比如serializers中。
@property
def comments(self):