gpt4 book ai didi

python - Django REST Framework 基于 URL 过滤查询集

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:39 25 4
gpt4 key购买 nike

当用户访问“baseurl/companies/6/inquiry/”时,我知道company_id是6。

然后用户可以选择创建特定产品的查询,但应该只能看到属于公司 6 的产品。

这是我的观点:

class InquiryViewSet(viewsets.ModelViewSet):
queryset = Inquiry.objects.all()
serializer_class = InquirySerializer

def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
context = self.get_serializer_context()
return serializer_class(*args, company_id=self.kwargs['company_id'], context=context, **kwargs)

这是我的序列化器:

class InquirySerializer(serializers.ModelSerializer):
def __init__(self, *args, company_id=None, **kwargs):
super(InquirySerializer, self).__init__(*args, **kwargs)
company_set = Company.objects.filter(pk=company_id)
self.fields['company'].queryset = company_set

company = serializers.HyperlinkedRelatedField(many=False,
view_name='company-detail',
queryset=Company.objects.all())
inquirer = UserPKField(many=False)
is_anonymous = serializers.BooleanField
product_rows = CompanyProductField(many=True, company_id= 'Want to access company_id in __init__')

class Meta:
model = Inquiry
fields = ('pk', 'company', 'inquirer_email', 'inquirer', 'is_anonymous', 'inquiry_date', 'product_rows')
read_only_fields = ('inquirer', 'inquiry_date')

这是 CompanyProductField

class CompanyProductField(serializers.PrimaryKeyRelatedField):
def __init__(self, *args, company_id=None, **kwargs):
super(CompanyProductField, self).__init__(*args, **kwargs)
self.company_id = company_id

def get_queryset(self):
product_query = Q(company__pk=self.company_id)
return Product.objects.filter(product_query)

必须有一种简单的方法我可以访问已经在 InquirySerializer 的 init 方法中的 company_id 并传递它,但我很难过。

最佳答案

class InquirySerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
company_id = kwargs.pop('company_id')
self.company_id = company_id
super().__init__(*args, **kwargs)

product_rows = CompanyProductField(many=True)

class CompanyProductField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
return Product.objects.filter(company_id=self.root.company_id)

在这种情况下,CompanyProductField 类的 self.root 属性将引用 InquirySerializer 的实例。

关于python - Django REST Framework 基于 URL 过滤查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com