在 Django REST framework 中序列化一对多关系

Wut*_*Wut 4 python django django-rest-framework

我有两个班级persontest,其中一个人可以进行多次测试。我试过序列化这个,但每次我尝试使用

person= Person.objects.create(title="mr",name="name",address="address",city="city")
Run Code Online (Sandbox Code Playgroud)

它抛出错误 IntegrityError: NOT NULL constraint failed: appname_person.tests_id

models.py

class Test(models.Model):
    date = models.DateTimeField(auto_now_add=True)
    test_name = models.CharField(max_length=200,default='',blank=False)
    test_subject = models.CharField(max_length=100,default='')
    test_type = models.CharField(max_length=100,default='') 

    def __str__(self):
        return self.test_name

class Person(models.Model):
    tests = models.ForeignKey(Test)
    title = models.CharField(max_length=3,default="mr",blank=False)
    name = models.CharField(max_length=50,default='',blank=False)
    address = models.CharField(max_length=200,default='',blank=False)
    city = models.CharField(max_length=100,default='',blank=False)

    def __str__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

serializers.py

class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = Test
        fields = ('test_name','test_subject','test_type')

class PersonSerializer(serializers.ModelSerializer):

    tests = TestSerializer(many=True, read_only=True)
    class Meta:
        model = Person
        fields = ('id', 'title', 'name', 'address', 'city')
Run Code Online (Sandbox Code Playgroud)

Boj*_*vic 6

好的,首先,反过来说,测试应该有一个指向用户模型的外键。

class Person(models.Model):
    title = models.CharField(max_length=3,default="mr",blank=False)
    name = models.CharField(max_length=50,default='',blank=False)
    address = models.CharField(max_length=200,default='',blank=False)
    city = models.CharField(max_length=100,default='',blank=False)

    def __str__(self):
        return self.name


class Test(models.Model):
    tests = models.ForeignKey(Person)
    date = models.DateTimeField(auto_now_add=True)
    test_name = models.CharField(max_length=200,default='',blank=False)
    test_subject = models.CharField(max_length=100,default='')
    test_type = models.CharField(max_length=100,default='') 

    def __str__(self):
        return self.test_name
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,最好用“person”替换“tests”作为更合适的命名形式。 (2认同)