2017-07-05 6 views
3

ユーザー訪問「BASEURL /企業/ 6 /問い合わせが/」、私はのcompany_idがあることを知っている6DjangoのRESTフレームワークフィルタのクエリセットURLに基​​づいて

次に、ユーザは、特定の製品との問い合わせを作成するためのオプションを持っていますが、唯一見るべき会社に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にアクセスして、ちょうどそれを渡すことができ、簡単な方法である必要がありますが、私は困惑。

答えて

2
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のインスタンスを参照します。

+0

'self.root.company_id'は私が探していたものです! –

1

今のところ、これをやや「ハッキリ」な方法で使用します。

私はグローバル変数を追加私のserializers.pyファイルで

:私のシリアライザのためのinitメソッドでは、私はglobal_company_idを設定すると

from rest_framework import serializers 
from .models import * 
from django.db.models import Q 

global_company_id = 0 

を:

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 
    global global_company_id 
    global_company_id = company_id 

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) 

そして、私がアクセスCompanyProductFieldでglobal_company_id:

+0

'company_id'属性を' product_rows'フィールドに設定するのはなぜですか? 'company'フィールドにquerysetを設定するのと同じですか? –

0

selfを01から削除できますget_serializer() `メソッド、

def get_serializer(self, *args, **kwargs): 
    serializer_class = self.get_serializer_class() 
    kwargs['context'] = self.get_serializer_context() 
    return serializer_class(company_id=kwargs['company_id'], *args, **kwargs) 
関連する問題