如何在Python djangorestframework中加入模型

时间:2017-11-10 18:45:02

标签: django python-3.x django-models django-rest-framework

我正在尝试在django-rest-framework中联合两个模型。 我的代码没有抛出任何错误,但也没有显示需要加入的其他模型字段。

以下是我的代码段:

串行器:

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)

提前致谢。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在您的观看中,您有

serializer_class = JobHistorySerializer()

从中删除括号。

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中看到的那样,它使用视图代码中未提供的args和kwargs初始化该序列化程序类。