Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django(DRF)-基于子属性在递归字段中筛选父项_Django_Recursion_Django Rest Framework - Fatal编程技术网

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