根据OnetoOne嵌套序列化器的模型标志返回数据

时间:2019-07-29 07:56:46

标签: django django-rest-framework

我正在使用嵌套序列化程序进行模型报价的一对一映射。但是我希望嵌套序列化器仅在嵌套序列化器的模型实例中的标记设置为true时才返回数据。我猜想to_representation在这里不起作用,因为它将接收一个对象实例而不是queryset。

Model :

class Offers(models.Model) :

    brand = models.CharField(max_length=100,blank=True,null=True)
    hospital = models.OneToOneField('hospital.Providers',to_field='hospital_id',on_delete=models.SET_NULL, related_name='hospital_offer',blank=True,null=True)
    validity = models.PositiveIntegerField(default=0)
    terms =  models.CharField(max_length=500,blank=True,null=True)
    discount = models.PositiveIntegerField(default=0)
    logo = models.CharField(max_length=100,blank=True,null=True)
    active = models.BooleanField(default=True)
    created_date = models.DateTimeField(auto_now_add=True)

Serializer :
class ProviderOffersSerializer(serializers.ModelSerializer) : 
    class Meta :
        model = Offers
        fields = ('brand','id')

class ProviderSerializer(serializers.ModelSerializer):
    hospital_offer = ProviderOffersSerializer(read_only=True)
    network = NetworkSerializer(read_only=True)
    class Meta:
        model = Providers
        fields = ('hospital_id','hospital_name','hospital_offer','pincode','network')

现在,仅当active为True时,ProviderSerializer才应返回要提供的数据。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您认为您在评论中提供的解决方案是正确的,但可以简化。

通过引用超类(to_representation)中的ModelSerializer方法,而不是引用序列化程序本身,您可以确切地得到所需的内容–序列化程序Offer对象。

这是完整的代码示例:

  

serializers.py

class ProviderOffersSerializer(serializers.ModelSerializer) : 
    class Meta :
        model = Offers
        fields = ('brand', 'id')

    def to_representation(self, offer):
        return super().to_representation(offer) if offer.active else None

您还可以从Python语义中受益。该代码与英语本身一样可读-“将报价有效的则序列化,否则-不返回任何内容”。