Relation Django OneToOne - comment la sérialiser?

Nov 14 2020

Exemple simple de classe d'élève et d'employé, je veux le sérialiser comme ci-dessous et cela devrait être une relation OneToOne:

{
  "college": "string",
  "year": "string",
  "is_with_college": true,
  "employee": {
    "full_name": "string",
    "email_id": "[email protected]",
    "mobile_no": "string",
    "is_job_ready": true,
    "type": "string",
    "location_preference": "string"
  }
}

des modèles:

class Employee(models.Model):
    full_name=models.CharField(max_length=100)
    email_id=models.EmailField(max_length=100)
    mobile_no=models.CharField(max_length=11)
    is_job_ready=models.BooleanField(False)
    type=models.CharField(max_length=20)
    location_preference=models.CharField(max_length=20)

class Student(models.Model):
    college=models.CharField(max_length=100)
    year=models.CharField(max_length=20)
    is_with_college=models.BooleanField()
    employee=models.OneToOneField(Employee, on_delete=models.CASCADE)

sérialiseurs:

class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = ('full_name', 'email_id', 'mobile_no', 'is_job_ready', 'type', 'location_preference')

class StudentSerializer(serializers.ModelSerializer):
    employee = EmployeeSerializer(many=False)
    class Meta:
        model = Student
        fields = ('college', 'year', 'is_with_college', 'employee')

    def create(self, validated_data):
        employee_data = validated_data.pop('employee')
        if employee_data:
            student = Student.objects.create(**validated_data)
            Employee.objects.create(student=student, **employee_data)
        return student

vues:

class EmployeeViewSet(viewsets.ModelViewSet):
    serializer_class = EmployeeSerializer
    queryset = Employee.objects.all()

class StudentViewSet(viewsets.ModelViewSet):
    serializer_class = StudentSerializer
    queryset = Student.objects.all()

Je ne suis pas sûr de ce que je fais de mal. J'essaye de changer quelques choses, j'ai encore des erreurs différentes. Je suis sûr que c'est simple et qu'il me manque quelque chose. En ce moment, j'ai:

NOT NULL constraint failed: rest_student.employee_id

Réponse: sérialiseur de relations OneToOne

J'espère que ça aide quelqu'un.

Réponses

1 tarasinf Nov 14 2020 at 09:31

Essayez de suivre cette réponse.

  1. Changer employee = EmployeeSerializer(many=False)en employee = EmployeeSerializer(read_only=True).

  2. Pour récupérer tous les étudiants ou employés, vous n'avez pas besoin d'ajouter def create(self, validated_data):. Ceci est nécessaire pour mettre à jour / créer des objets imbriqués.

user10620635 Nov 14 2020 at 12:43

Voici la réponse à ma question :) Sérialiseur de relations OneToOne