2016-07-23 5 views
0

Mein django Modell sieht wie folgt aus:Django ruhen erfolglosen Anfrage von Client

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' 

Ich habe einen Serializer:

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 

Meine Form:

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

Und meine Ansicht:

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

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

Ich habe ein Ionic2 Frontend und mein Service hat folgende Funktion Instanz des obigen Modells zu speichern:

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) 
    } 

ich auch ein Modell, auf Kundenseite:

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 
    ){} 
} 

Wie ich sehe, wird das Token an das Backend gesendet, aber ich bekomme eine Antwort, die sagt {"owner":["This field is required."]}

Senden Token nicht genug? Wenn ich 'Eigentümer' auch von meiner Service-Anfrage übergeben muss, was sein Wert sein sollte (aber Token sollte genug sein, nehme ich an)?

Oder fehlt mir etwas auf Backend-Seite?

Antwort

1

Meine Vermutung ist, dass das Problem ist, dass Sie einen Serializer falsch erstellen. Sie geben speziell an, __all__ Felder zu verwenden, die alle Felder bedeuten. Dies ist nicht relevant, aber Sie sollten nicht wirklich ein Modell erstellen oder aktualisieren müssen.

Stattdessen versuchen so etwas wie dieses

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',) 

Das ist alles was Sie brauchen sollten.

+0

Perfekt! Das hat funktioniert! – Nitish