6.11大杂烩。。

一、get_or_create 

get_or_create : 如果查询到就返回,如果没有查询到就向数据库加入新的对象。返回的是一个元祖。

二、python如何判断web访问来源是PC端还是手机端

def judge_pc_or_mobile(ua):
        """
        判断访问来源是pc端还是手机端
        :param ua: 访问来源头信息中的User-Agent字段内容
        :return:
        """
        factor = ua
        is_mobile = False
        _long_matches = r'googlebot-mobile|android|avantgo|blackberry|blazer|elaine|hiptop|ip(hone|od)|kindle|midp|mmp' \
                        r'|mobile|o2|opera mini|palm( os)?|pda|plucker|pocket|psp|smartphone|symbian|treo|up\.(browser|link)' \
                        r'|vodafone|wap|windows ce; (iemobile|ppc)|xiino|maemo|fennec'
        _long_matches = re.compile(_long_matches, re.IGNORECASE)
        _short_matches = r'1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)' \
                         r'|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)' \
                         r'|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw' \
                         r'|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8' \
                         r'|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit' \
                         r'|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)' \
                         r'|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji' \
                         r'|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx' \
                         r'|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi' \
                         r'|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)' \
                         r'|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg' \
                         r'|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21' \
                         r'|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-' \
                         r'|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it' \
                         r'|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)' \
                         r'|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)' \
                         r'|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit' \
                         r'|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-'

        _short_matches = re.compile(_short_matches, re.IGNORECASE)

        if _long_matches.search(factor) != None:
            is_mobile = True
        user_agent = factor[0:4]
        if _short_matches.search(user_agent) != None:
            is_mobile = True

        return is_mobile

    #调用
    template_name = 'frontend_desktop/index.html'
    if judge_pc_or_mobile(request.META['HTTP_USER_AGENT']):
        template_name = 'frontend_mobile/index.html'

三、小细节

1、 一般render返回页面的时候尽量返回对象,然后用对象去点。如果想要获取的数据没有,可以循环当前那个对象,
给这个对象设置一个属性。比如:

# 最热游戏
hot_games = Game.objects.all().order_by('-pv')[:4]
for i in hot_games:
  score = GameLog.objects.filter(game__name=i.name).aggregate(score=Max('score'))
  if score['score'] == None:
  score['score'] = 0

  i.__setattr__('maxscore', score['score'])
return render(request, template_name, context={'hot_games': hot_games})

2、一般要筛选数据结果的时候,比如要最新的前几条数据,可以先查后筛,然后返回前端,不要吧结果都返回了在前端筛。比如:

course_obj2 = Category.objects.filter(type='course', is_show_banner=True).order_by("-create_time")
course_banner_list = []
for i in course_obj2:
  if i.parent and i.children.all(): # 如果有父亲说明是课程或者节
    course_banner_list.append(i)
  if len(course_banner_list) == 6:
    break

 3、注意在render页面的时候如果要求是登陆用户看,加上@login_required(login_url='/d_login_page/')装饰器。导入:from django.contrib.auth.decorators import login_required

如果是借口注意加上@csrf_exempt装饰器,导入:from django.views.decorators.csrf import csrf_exempt

四、model操作

#方式一 :在模型类上添加一个classmethod:
    class Book(models.Model):
        title = models.CharField(max_length=20)

        @classmethod
        def create(cls, title):
            book = cls(title=title)
            return book

    book = Book.create('追风筝的人')

    # 方式二:在自定义管理器中添/一个方法(通常是首选):
    class BookManager(models.Manager):
        def create_book(self, title):
            book = self.create(title=title)
            return book

    class Book(models.Model):
        title = models.CharField(max_length=20)
        objects = BookManager()
        
    book = Book.objects.create_book('追风筝的人')

五、验证对象

验证模型涉及三大步骤:
1、验证模型字段:Model.clean_fields()
2、验证整个模型:Model.clead()
3、验证字段唯一性:Model.validate_unique()
当您调用模型的full_clean()方法时,所有三个步骤都会执行 。
Model.full_clean(exclude = None,validate_unique = True)[source] 
此方法按此顺序调用Model.clean_fields(),Model.clean()(和 Model.validate_unique()如果validate_unique是True),并引发一个包含来自所有三个阶段的错误ValidationError的 message_dict属性。

六、保存对象save()方法

要将对象保存到数据库,请调用save()
如果你想要自定义保存行为,则可以重写save()方法。覆盖内置方法的经典用例是,如果你希望在保存对象时发生某些事情,例如:
from django.db import models
class Blog(models.Model):
    name = models.CharField(max_length100)
    tagline = models.TextField()

    def save(self,*args,**kwargs):
        do_something()
        super().save(*args ,**kwargs)
        do_something_else()


也可以防止保存:
from django.db import models
class Blog(models.Model):
    name = models.CharField(max_length100)
    tagline = models.TextField()

    def save(self,*args,**kwargs):
        if self.name == 'haiyan':
            return
        else:
            super().save(*args,**kwargs)
记住调用基类方法,这就是该业务-以确保该对象仍然保存到数据库中非常重要。如果你忘记调用该父类方法,则默认行为
将不会发生,并且数据库不会被触及.super.save(*args,**kwargs)

七、model其他模型实例方法

1、__str__(self)
   __str__(self)每次调用str()对象都会调用该方法,吧对象转换成字符串显示,e.g:
           from django.db import models
           class Person(models.Model):
               first_name = models.CharField(max_length=50)
            last_name = models.CharField(max_length=50)

            def __str__(self):
                return '%s %s' % (self.first_name, self.last_name)    
2、__eq__(self)
  等式方法被定义为使用具有相同主键值和相同具体类的实例被认为是相同的,除了具有主键值的实例None不等于除自身以外的任何实例
  。对于代理模型,具体类被定义为模型的第一个非代理父代;对于所有其他模型,他只是模型的类。
3、get_absolute_url()
    - 定义一个get_absolute_url()方法来告诉Django如何计算一个对象的规范url。对于调用者来说,这个方法似乎应该返回一个
        可以用来通过http引用对象的字符串。比如:
        def get_absolute_url(self):
            return reverse('frontend:courseware_details', args=[self.id])
        Django使用一个地方get_absolute_url()是在管理应用程序中。如果一个对象定义了这个方法,那么对象编辑页面将会有一个
        ‘View on site’链接,它将直接跳转到对象的公共视图
    - get_absolute_url()在模版中使用也是一种很好的做法,而不是对对象的url进行硬编码。例如,
        old_url :<a href="/people/{{ object.id }}/">{{ object.name }}</a>
        new_url :<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>

3、get_field_display() :对于已choice设置的每个字段,对象都有一个get_field_display()方法,其中field是该字段的
  名称。该方法返回该字段choice 指定对应的值。e.g:
      from django.db import models
      class Person(models.Model):
          SHIRT_SIZES = (
              ('S','Small'),
              ('M','Medium'),
              ('S','Large'),
          )
          name = models.CharField(max_length=20)
          shirt_sizes = models.CharField(max_length30)

    >>> p = Person(name="Fred Flintstone", shirt_size="L")
    >>> p.save()
    >>> p.shirt_size
    'L'
    >>> p.get_shirt_size_display()
    'Large'

猜你喜欢

转载自www.cnblogs.com/haiyan123/p/9168436.html