70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
from django.db import models
 | 
						|
from django.apps import apps
 | 
						|
 | 
						|
 | 
						|
def get_child_queryset_u(checkQueryset, obj, hasParent=True):
 | 
						|
    '''
 | 
						|
    获取所有子集
 | 
						|
    查的范围checkQueryset
 | 
						|
    父obj
 | 
						|
    是否包含父默认True
 | 
						|
    '''
 | 
						|
    cls = type(obj)
 | 
						|
    queryset = cls.objects.none()
 | 
						|
    fatherQueryset = cls.objects.filter(pk=obj.id)
 | 
						|
    if hasParent:
 | 
						|
        queryset = queryset | fatherQueryset
 | 
						|
    child_queryset = checkQueryset.filter(parent=obj)
 | 
						|
    while child_queryset:
 | 
						|
        queryset = queryset | child_queryset
 | 
						|
        child_queryset = checkQueryset.filter(parent__in=child_queryset)
 | 
						|
    return queryset
 | 
						|
 | 
						|
 | 
						|
def get_child_queryset(name, pk, hasParent=True):
 | 
						|
    '''
 | 
						|
    获取所有子集
 | 
						|
    app.model名称
 | 
						|
    Id
 | 
						|
    是否包含父默认True
 | 
						|
    '''
 | 
						|
    app, model = name.split('.')
 | 
						|
    cls = apps.get_model(app, model)
 | 
						|
    queryset = cls.objects.none()
 | 
						|
    fatherQueryset = cls.objects.filter(pk=pk)
 | 
						|
    if fatherQueryset.exists():
 | 
						|
        if hasParent:
 | 
						|
            queryset = queryset | fatherQueryset
 | 
						|
        child_queryset = cls.objects.filter(parent=fatherQueryset.first())
 | 
						|
        while child_queryset:
 | 
						|
            queryset = queryset | child_queryset
 | 
						|
            child_queryset = cls.objects.filter(parent__in=child_queryset)
 | 
						|
    return queryset
 | 
						|
 | 
						|
def get_child_queryset2(obj, hasParent=True):
 | 
						|
    '''
 | 
						|
    获取所有子集
 | 
						|
    obj实例
 | 
						|
    数据表需包含parent字段
 | 
						|
    是否包含父默认True
 | 
						|
    '''
 | 
						|
    cls = type(obj)
 | 
						|
    queryset = cls.objects.none()
 | 
						|
    fatherQueryset = cls.objects.filter(pk=obj.id)
 | 
						|
    if hasParent:
 | 
						|
        queryset = queryset | fatherQueryset
 | 
						|
    child_queryset = cls.objects.filter(parent=obj)
 | 
						|
    while child_queryset:
 | 
						|
        queryset = queryset | child_queryset
 | 
						|
        child_queryset = cls.objects.filter(parent__in=child_queryset)
 | 
						|
    return queryset
 | 
						|
 | 
						|
def get_parent_queryset(obj, hasSelf=True):
 | 
						|
    cls = type(obj)
 | 
						|
    ids = []
 | 
						|
    if hasSelf:
 | 
						|
        ids.append(obj.id)
 | 
						|
    while obj.parent:
 | 
						|
        obj = obj.parent
 | 
						|
        ids.append(obj.id)
 | 
						|
    return cls.objects.filter(id__in=ids) |