• QuerySet 重复的问题,使用 .distinct() 去重

    一般的情况下,QuerySet 中不会出来重复的,重复是很罕见的,但是当跨越多张表进行检索后,结果并到一起,可以会出来重复的值(我最近就遇到过这样的问题)

    qs1 = Pathway.objects.filter(label__name='x')
    qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
    qs3 = Pathway.objects.filter(inputer__name='WeizhongTu')
     
    # 合并到一起
    qs = qs1 | qs2 | qs3      #|的用法?
    这个时候就有可能出现重复的
     
    # 去重方法
    qs = qs.distinct()
    

      

    在列表显示与字段相关的其它内容

    list_display 就是来配置要显示的字段的,当然也可以显示非字段内容,或者字段相关的内容,比如:

    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
     
        def my_property(self):
            return self.first_name + ' ' + self.last_name
        my_property.short_description = "Full name of the person"
     
        full_name = property(my_property)
    

      在admin.py中

    from django.contrib import admin
    from .models import Article, Person
     
     
    class ArticleAdmin(admin.ModelAdmin):
        list_display = ('title', 'pub_date', 'update_time',)
     
     
    class PersonAdmin(admin.ModelAdmin):
        list_display = ('full_name',)
     
    admin.site.register(Article, ArticleAdmin)
    admin.site.register(Person, PersonAdmin)
    

      

    有时候我们需要对django admin site进行修改以满足自己的需求,那么我们可以从哪些地方入手呢?

    1.定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法

    class MyModelAdmin(admin.ModelAdmin):
        def get_queryset(self, request):
            qs = super(MyModelAdmin, self).get_queryset(request)
            if request.user.is_superuser:
                return qs
            else:
                return qs.filter(author=request.user)
    

      该类实现的功能是如果是超级管理员就列出所有的,如果不是,就仅列出访问者自己相关的

    2.定制搜索功能(django 1.6及以上才有)

    class PersonAdmin(admin.ModelAdmin):
        list_display = ('name', 'age')
        search_fields = ('name',)
     
        def get_search_results(self, request, queryset, search_term):
            queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
            try:
                search_term_as_int = int(search_term)
                queryset |= self.model.objects.filter(age=search_term_as_int)
            except:
                pass
            return queryset, use_distinct
    

      queryset 是默认的结果,search_term 是在后台搜索的关键词

    3.修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人

    from django.contrib import admin
     
    class ArticleAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            obj.user = request.user
            obj.save()
    

     其中obj是修改后的对象,form是返回的表单(修改后的),当新建一个对象时 change = False, 当修改一个对象时 change = True
    如果需要获取修改前的对象的内容可以用 

    from django.contrib import admin
     
    class ArticleAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            obj_original = self.model.objects.get(pk=obj.pk)
            obj.user = request.user
            obj.save()
    

      那么又有问题了,这里如果原来的obj不存在,也就是如果我们是新建的一个怎么办呢,这时候可以用try,except的方法尝试获取,当然更好的方法是判断一下这个对象是新建还是修改,是新建就没有 obj_original,是修改就有

    from django.contrib import admin
     
    class ArticleAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            if change:# 更改的时候
                obj_original = self.model.objects.get(pk=obj.pk)
            else:# 新增的时候
                obj_original = None
     
            obj.user = request.user
            obj.save()
    

      

    4, 删除时做一些处理,

    from django.contrib import admin
     
    class ArticleAdmin(admin.ModelAdmin):
        def delete_model(self, request, obj):
            """
            Given a model instance delete it from the database.
            """
            # handle something here
            obj.delete()
    

      

  • 相关阅读:
    基于CodeSmith的三层架构代码模板
    全自动时代:JavaScript自动压缩插件
    NServiceBus最流行的开源企业服务总线 for .Net
    神奇的东西
    WebMatrix
    .Net TDD我用Machine.Specification
    JQuery Smart UI 简介(四) — 强大的适用性&存在问题【项目使用性介绍】
    JQuery Smart UI 简介(三)
    JQuery Smart UI 简介(二)
    基于WCF大型分布式系统的架构设计
  • 原文地址:https://www.cnblogs.com/songbird/p/5204017.html
Copyright © 2020-2023  润新知