Django REST Framework连接表导致属性异常

时间:2018-01-11 13:20:48

标签: django django-rest-framework

我正在使用REST Framework在Django中构建API,但遇到了一个问题。

串行器:

class SquadSerializer(serializers.Serializer):
    class Meta:
        model = Squad
        fields = ('name')

    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(style={'base_template': 'textarea.html'})

class MembershipSerializer(serializers.Serializer):
    class Meta:
        model = Membership
        fields = ('employee_id', 'squad_id')

    squad = SquadSerializer()
    employee = EmployeeSerializer()

class EmployeeSerializer(serializers.HyperlinkedModelSerializer):
    habitat = HabitatSerializer()

    class Meta:
        model = Employee
        fields = ('id', 'first_name', 'last_name', 'function',
                'start_date', 'end_date', 'visible_site', 'habitat')

型号:

class Employee(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    function = models.CharField(max_length=50)
    start_date = models.DateField()
    end_date = models.DateField(null=True, blank=True)
    visible_site = models.BooleanField()
    habitat = models.ForeignKey(Habitat, on_delete=models.SET_NULL, null=True, blank=True)

class Squad(models.Model):
    name = models.TextField(max_length=40)

class Membership(models.Model):
    class Meta:
        unique_together = (('employee', 'squad'))

    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, null=False, blank=True, default=1)
    squad = models.ForeignKey(Squad, on_delete=models.CASCADE, null=False, blank=True, default=1)

问题是我一直遇到这个错误:

AttributeError: Got AttributeError when attempting to get a value for field `name` on serializer `SquadSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Membership` instance.
Original exception text was: 'Membership' object has no attribute 'name'.

执行此测试时(以及其他几个)

def test_membership_serializer_id_name_field_content(self):
    """
    The name field of a squad should contain an id
    """
    serializer = create_membership_serializer(self.membership, '')
    self.assertEqual(serializer.data['id'], self.membership.id)

我已经在Stack Overflow上看到了具有相同问题的多人,但通常建议的解决方案(将多个= True添加到SquadSerializer()和EmployeeSerializer())并不起作用。我希望这里有人知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

如果要将seriailizer映射到模型,则应使用ModelSerializer。在tupple中,如果它只有一个值,则应将其写为(1,)而不是(1)。您的SquadSerializer应该是

class SquadSerializer(serializers.ModelSerializer):
    class Meta:
        model = Squad
        fields = ('name',) # or ('id', 'name')

    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(style={'base_template': 'textarea.html'})

您的MembershipSerializer应该是

class MembershipSerializer(serializers.ModelSerializer):
    class Meta:
        model = Membership
        fields = ('employee', 'squad')

    squad = SquadSerializer()
    employee = EmployeeSerializer()