Django的从客户休息不成功的请求

问题描述:

我的Django模型看起来像下面:Django的从客户休息不成功的请求

class ExhibitionSurveyObject(models.Model): 
    owner = models.ForeignKey(User, verbose_name="Owner of this Survey object", blank=False,) 
    name = models.CharField(max_length=15, blank=False, verbose_name="Survey Object name", help_text="Please give a single word name for your farm",) 
    farmer_email = models.EmailField(max_length=254, blank=False, verbose_name="Email of the farmer",) 
    farmer_name = models.CharField(max_length=25, blank=False, verbose_name="Name of the farmer",) 
    address = models.TextField(help_text="Please provide the address without the postal code", blank=True,) 
    postal_code = models.CharField(max_length=5, blank=True, default='12043') 
    size = models.DecimalField(max_digits=9, decimal_places=6, blank=False,) 
    path = models.CharField(max_length=1000, blank=False) 
    def setpath(self, x): 
     self.path = json.dumps(x) 

    def getpath(self, x): 
     return json.loads(self.path) 

    OBJECT_TYPES = (
     ('FARM', 'Farm'), 
     ('SOLARPANEL', 'Solarpanel'), 
     ('PLAIN', 'plain') 
     ) 
    object_type = models.CharField(max_length=100, choices=OBJECT_TYPES) 
    CYCLES = (
     ('ONCE', 'once'), 
     ('WEEKLY', 'weekly'), 
     ('MONTHLY', 'monthly') 
     ) 
    cycle = models.CharField(max_length=100, choices=CYCLES) 

    #To add user's full name in the admin interface for better readability 
    def get_owner_full_name(self): 
     return self.owner.get_full_name() 

    #Works like a verbose_name but for a method 
    get_owner_full_name.short_description = 'Owners full name' 

我有一个串行:

class ExhibitionSurveyObjectSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = ExhibitionSurveyObject 
     fields = '__all__' 

    def create(self, validated_data): 
     return ExhibitionSurveyObject.objects.create(**validated_data) 

    def update(self, instance, validated_data): 
     instance.name = validated_data.get('name', instance.name) 
     instance.farmer_email = validated_data.get('farmer_email', instance.farmer_email) 
     instance.farmer_name = validated_data.get('farmer_name', instance.farmer_name) 
     instance.address = validated_data.get('address', instance.address) 
     instance.postal_code = validated_data.get('postal_code', instance.postal_code) 
     instance.size = validated_data.get('size', instance.size) 
     instance.path = validated_data.get('path', instance.path) 
     instance.object_type = validated_data.get('object_type', instance.object_type) 
     instance.cycle = validated_data.get('cycle', instance.cycle) 
     instance.save() 
     return instance 

我的形式:

class ExhibitionSurveyObjectForm(forms.ModelForm): 
    owner = CustomUserChoiceField(queryset=User.objects.all()) 
    class Meta: 
     model = ExhibitionSurveyObject 
     fields = "__all__" 

而我的观点:

class ExhibitionSurveyObjectList(generics.ListCreateAPIView): 
    queryset = ExhibitionSurveyObject.objects.all() 
    serializer_class = ExhibitionSurveyObjectSerializer 

    def perform_create(self, serializer): 
    serializer.save(owner=self.request.user) 

我有一个Ionic2前端和我的服务有以下功能来保存上述模型的实例:

addObject(

    name: string, 
    farmer_email: string, 
    farmer_name: string, 
    size: string, 
    path: Array<google.maps.LatLngLiteral>, 
    cycle: string, 
    object_type: string) { 
    let obj = new ExhibitionSurveyObjectModel(name, farmer_email, farmer_name, size, path, cycle, object_type); 

    let body = JSON.stringify(obj); 
    let headers = new Headers({ 'Content-Type': 'application/json; charset=utf-8', 'Authorization': 'Token ' + localStorage.getItem('auth_token') }); 
    let options = new RequestOptions({ headers: headers }); 
    console.log(body); 
    return this.http.post(this._exhibitionSurveyObjectURL, body, options) 
        .map(this.extractData) 
        .catch(this.handleError) 
    } 

我也有一个模型,我客户端:

export class ExhibitionSurveyObjectModel { 
    constructor(
    public name: string, 
    public farmer_email: string, 
    public farmer_name: string, 
    public size: string, 
    public path: Array<google.maps.LatLngLiteral>, 
    public cycle: string, 
    public object_type: string, 
    public owner: string 
    ){} 
} 

正如我所看到的令牌正在发送到后端,但我得到的回应说{"owner":["This field is required."]}

发送令牌不够?如果我必须通过'所有者'以及我的服务请求,那么它的价值应该是什么(但是,令牌应该足够了,我想)?

或者我错过了后端?

我的猜测是问题在于您正在错误地创建序列化程序。您特别指示使用__all__字段,这意味着所有字段。与此无关,但你不应该真的需要在模型serielizer上创建或更新。

相反,尝试这样

class ExhibitionSurveyObjectSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ExhibitionSurveyObject 
     fields = ('name', 'farmer_email', 'farmer_name', 'address', 
        'postal_code', 'size', 'path', 'object_type', 
        'cycle') 
     read_only_fields = ('owner',) 

这应该是所有你需要的东西。

+0

完美!这工作! – Nitish