Django(DRF)-基于子属性在递归字段中筛选父项
我有一个递归的模型Django(DRF)-基于子属性在递归字段中筛选父项,django,recursion,django-rest-framework,Django,Recursion,Django Rest Framework,我有一个递归的模型 class Organization(models.Model): business_name = models.CharField(max_length=100, unique=True) # recursive relationship organization = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='or
class Organization(models.Model):
business_name = models.CharField(max_length=100, unique=True)
# recursive relationship
organization = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='organizations')
我有另一个模型,它是这个递归模型的子模型,它可以是树中任意一点的子模型
class Store(models.Model):
registration_no = models.CharField(max_length=8, default=increment_registration_no, unique=True)
organization = models.OneToOneField(Organization, on_delete=models.PROTECT, related_name='store', null=True)
在该应用程序的UI中,存储列表在递归表中列出,其中包含上述组织标题。我们有一个专门为此列表设计的序列化程序。当用户查看此列表时,他们可以按组织
和存储
属性进行筛选
class StoreSerializer(serializers.ModelSerializer):
registration_no = serializers.CharField(read_only=True)
class Meta:
model = Store
fields = ('id', 'registration_no')
class StoreFilterSerializer(serializers.ModelSerializer):
registration_no = serializers.CharField(read_only=True)
def to_representation(self, value):
# Turn single object into a query so that we can use django filters
queryset = Store.objects.filter(pk=value.id)
registration_no = self.context['request'].query_params.get('registration_no', None)
if registration_no is not None:
queryset = queryset.filter(registration_no__icontains=registration_no)
if queryset:
# Represent object with serializer defined above
return StoreSerializer(queryset[0]).data
else:
return {}
class Meta:
model = Store
class OrganizationsSerializer(serializers.ModelSerializer):
store = StoreFilterSerializer(read_only=True)
organizations = RecursiveField(many=True)
class Meta:
model = Organization
fields = ('id', 'business_name', 'organization', 'organizations', 'store')
如上所述,如果我们传入一个注册号
,则可以过滤掉存储。但是,假设用户输入的字符串与单个存储不匹配。然后,不会退回任何门店,但会退回一批组织。在UI中,这会导致表为空,因为没有存储行,但分页菜单具有每个页面,因为没有筛选组织
所以问题是,我如何筛选组织,以确定它们是否会在存储筛选之后在递归树的某个位置拥有存储(注册号)是否已应用?我最终采用的解决方案是筛选我需要的门店并获取组织,而不是根据门店属性筛选组织
class StoreSerializer(serializers.ModelSerializer):
registration_no = serializers.CharField(read_only=True)
class Meta:
model = Store
fields = ('id', 'registration_no')
class StoreFilterSerializer(serializers.ModelSerializer):
registration_no = serializers.CharField(read_only=True)
def to_representation(self, value):
# Turn single object into a query so that we can use django filters
queryset = Store.objects.filter(pk=value.id)
registration_no = self.context['request'].query_params.get('registration_no', None)
if registration_no is not None:
queryset = queryset.filter(registration_no__icontains=registration_no)
if queryset:
# Represent object with serializer defined above
return StoreSerializer(queryset[0]).data
else:
return {}
class Meta:
model = Store
class OrganizationsSerializer(serializers.ModelSerializer):
store = StoreFilterSerializer(read_only=True)
organizations = RecursiveField(many=True)
class Meta:
model = Organization
fields = ('id', 'business_name', 'organization', 'organizations', 'store')
筛选存储有多种方法可以做到这一点 获取所有门店的家长
all_orgs = []
for store in store_queryset:
all_orgs.push(store.get_all_parents())
获得所有的机会
queryset=Organizations.objects.filter(organization\uuuuu in=all\uOrgs)
然后返回组织我最终采用的解决方案是筛选我需要的商店并获取组织,而不是根据商店属性筛选组织
class StoreSerializer(serializers.ModelSerializer):
registration_no = serializers.CharField(read_only=True)
class Meta:
model = Store
fields = ('id', 'registration_no')
class StoreFilterSerializer(serializers.ModelSerializer):
registration_no = serializers.CharField(read_only=True)
def to_representation(self, value):
# Turn single object into a query so that we can use django filters
queryset = Store.objects.filter(pk=value.id)
registration_no = self.context['request'].query_params.get('registration_no', None)
if registration_no is not None:
queryset = queryset.filter(registration_no__icontains=registration_no)
if queryset:
# Represent object with serializer defined above
return StoreSerializer(queryset[0]).data
else:
return {}
class Meta:
model = Store
class OrganizationsSerializer(serializers.ModelSerializer):
store = StoreFilterSerializer(read_only=True)
organizations = RecursiveField(many=True)
class Meta:
model = Organization
fields = ('id', 'business_name', 'organization', 'organizations', 'store')
筛选存储有多种方法可以做到这一点 获取所有门店的家长
all_orgs = []
for store in store_queryset:
all_orgs.push(store.get_all_parents())
获得所有的机会
queryset=Organizations.objects.filter(organization\uuuuu in=all\uOrgs)
然后返回orgs