2017-10-16 6 views
1

Je souhaite créer une API permettant d'envoyer des requêtes JSON via une requête POST. Le JSON doit ensuite être transmis à un sérialiseur qui prend soin de créer un nouvel objet et de le remplir avec les données existantes.Framework Django REST - Relation OneToOne via JSON

Cela fonctionne très bien pour les cas «simples» tels que les entrées de caractères de base comme les noms d'utilisateur et similaires, mais je suis sérieusement bloqué quand il s'agit de créer une relation OneToOne. Voici l'exemple de code.

Fonction appelée employee_list dans views.py - data['account'] est un nom d'utilisateur valide, une instance de User a été sélectionnée avec succès!

data = JSONParser().parse(request) 
user_object = User.objects.get(username=data['account']) 
data['account'] = user_object # this is now a valid User object 
serializer = EmployeeSerializer(data=data) 
if serializer.is_valid(): 
    serializer.save() 
    return JsonResponse(serializer.data, status=201) 
return JsonResponse(serializer.errors, status=400) 

Le modèle

class Employee(models.Model) 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(...) 
    surname = models.CharField... 
    account = models.OneToOneField(User) 
    role = ... 
    salary = ... 
    picture = ... 

Et le sérialiseur

class EmployeeSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Employee 
    fields = (...) # all fields of the `Employee` model 

Jusqu'à présent, si bon, cependant, le sérialiseur ne valide! Lorsque je supprime le besoin d'une relation OneToOne, cela fonctionne.

Comment créer un nouvel objet Employee avec une relation OneToOne en cours de traitement avec un objet User?

Merci d'avance.

+0

Quelle est l'erreur de validation? Vous pouvez passer raise_exception à l'intérieur: is_valid (raise_exception = True) – arjun27

+0

Merci pour le conseil, je ne savais même pas que c'était possible. Cela m'a donné l'erreur exacte, j'ai été capable de le résoudre seul à cause de cela. Merci beaucoup! – fweidemann14

Répondre

2

Vous devez passer le pk de l'objet User, plutôt que l'objet User.

Solution:

data['account'] = user_object.pk 
+0

Yup, a déjà fait la même chose. Fonctionne parfaitement. – fweidemann14

1

Le problème est dû au fait qu'un objet utilisateur est passé au sérialiseur, alors qu'il peut être simplement transmis au sérialiseur, tout en enregistrant l'objet. Essayez quelque chose comme ceci:

data = JSONParser().parse(request) 
user_object = User.objects.get(username=data['account']) 
serializer = EmployeeSerializer(data=data) 

if serializer.is_valid(): 
    # pass object to save, instead of saving in the data dictionary 
    serializer.save(account=user_object) 
    return JsonResponse(serializer.data, status=201) 

return JsonResponse(serializer.errors, status=400) 
+0

Oui, j'ai essayé ça aussi, alors j'ai vu que je pouvais juste utiliser la clé primaire à la place, c'était beaucoup plus facile. Upvoted de toute façon, peut-être que cela aide les autres. ;) – fweidemann14