2017-06-10 39 views
0

目標:將對象添加到另一個DataModel的ManyToMany字段。Python django序列化程序 - > validated_data刪除字段

與多對多字段中的數據模型:

class ObservedDataModel(models.Model): 
    domain_objects = models.ManyToManyField(DomainNameModel, blank=True) 

下面的代碼工作,但異物ID被硬編碼((ObservedDataModel, id=2)):

class DomainSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = DomainNameModel 
     fields = ('url', 'id', 'name') 

    def create(self, validated_data): 
     domain_obj = DomainNameModel.objects.create(name=validated_data['name']) 

     observed_data_object = get_object_or_404(ObservedDataModel, id=2) # TODO !!!!!! 
     observed_data_object.domain_objects.add(domain_obj) 

     return domain_obj 

讓用戶設置(ObservedDataModel, id=X)從來就試圖發送請求{'name': 'apple.com', 'observeddata': 2},但validated_data字段不包含變量observeddata

那麼如何添加一個自定義(非模型)字段到validated_data變量?

回答

1

剛剛找到答案使用我的問題(偉大的功能!)的計算器建議。解決的辦法是覆蓋to_internal_value象下面這樣:

def to_internal_value(self, data): 
    internal_value = super(DomainSerializer, self).to_internal_value(data) 
    my_non_model_field_raw_value = data.get("observeddata") 
    my_non_model_field_value = my_non_model_field_raw_value 
    internal_value.update({ 
     "observeddata": my_non_model_field_value 
    }) 
    return internal_value 

Thanks to trubliphone

0

覆蓋串行的init方法,

class DomainSerializer(serializers.HyperlinkedModelSerializer): 

    def __init__(self, obs_data, *args, **kwargs): 
     super(DomainSerializer, self).__init__(*args, **kwargs) 
     self.obs_data = obs_data 

    class Meta: 
     model = DomainNameModel 
     fields = ('url', 'id', 'name') 

    def create(self, validated_data): 
     domain_obj = DomainNameModel.objects.create(name=validated_data['name']) 
     observed_data_object = get_object_or_404(ObservedDataModel, id=self.obs_data) # here's the item.... 
     observed_data_object.domain_objects.add(domain_obj) 
     return domain_obj 

在視圖,

DomainSerializer(data=your_data, obs_data=observed_data_id) 
相關問題