2017-11-10 8 views
0

私はdjango-rest-frameworkで2つのモデルを結合しようとしています。 私のコードではエラーは発生しませんが、結合が必要な他のモデルフィールドも表示されません。Pythonでモデルに参加する方法djangorestframework

シリアライザ:

class CompaniesSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Companies 
     fields = ('id', 'title', 'category') 

class JobhistorySerializer(serializers.ModelSerializer): 
    companies = CompaniesSerializer(many=True,read_only=True) 
    class Meta: 
     model = Jobhistory 
     fields = ('id', 'title', 'company_id', 'companies') 

ビュー

は、以下の私のコードスニペットです。

class UserJobs(generics.ListAPIView): 
    serializer_class = JobhistorySerializer() 

    def get_queryset(self): 
     user_id = self.kwargs['user_id'] 
     data = Jobhistory.objects.filter(user_id=user_id) 
     return data 

モデル:事前に

class Companies(models.Model): 
    id = models.AutoField(primary_key=True) 
    title = models.CharField(max_length=100, blank=True, default='') 
    category = models.CharField(max_length=30, blank=True, default='') 
    created = models.DateTimeField(auto_now_add=True) 

class Meta: 
    ordering = ('created',) 

def save(self, *args, **kwargs): 
    title = self.title or False 
    category = self.category or False 
    super(Companies, self).save(*args, **kwargs) 

class Jobhistory(models.Model): 
    id = models.AutoField(primary_key=True) 
    company_id = models.ForeignKey(Companies) 
    title = models.CharField(max_length=100, blank=True, default='') 
    created = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     ordering = ('created',) 

    def save(self, *args, **kwargs): 
     company_id = self.company_id or False 
     title = self.title or False 

    super(Jobhistory, self).save(*args, **kwargs) 

感謝。どんな助けもありがとう。あなたは

serializer_class = JobHistorySerializer() 

を持って、あなたの意見で

+0

表示されていないフィールドについて説明できますか? 'company_id'または' companies'?また、 'models.py'ファイルを追加できますか? – PatDuJour

+0

私は、企業のモデルのすべての分野が応答として追加されることを望みます。 –

+0

'models.py'ファイルを見ると非常に便利です。私は 'Jobhistory'が' Companies'へのForeignKeyを持っていると仮定していますか? – PatDuJour

答えて

0

が、このことから括弧を削除します。

この理由はGenericAPIViewに明らかである、特にget_serializer()get_serializer_class()方法:

def get_serializer(self, *args, **kwargs): 
    """ 
    Return the serializer instance that should be used for validating and 
    deserializing input, and for serializing output. 
    """ 
    serializer_class = self.get_serializer_class() 
    kwargs['context'] = self.get_serializer_context() 
    return serializer_class(*args, **kwargs) 

def get_serializer_class(self): 
    """ 
    Return the class to use for the serializer. 
    Defaults to using `self.serializer_class`. 
    You may want to override this if you need to provide different 
    serializations depending on the incoming request. 
    (Eg. admins get full serialization, others get basic serialization) 
    """ 
    assert self.serializer_class is not None, (
     "'%s' should either include a `serializer_class` attribute, " 
     "or override the `get_serializer_class()` method." 
     % self.__class__.__name__ 
    ) 

    return self.serializer_class 

あなたがget_serializerで見ることができるように、それは引数とkwargsからとシリアライザクラスが提供されていないということを初期化しますあなたのビューコード。

関連する問題