Django Rest框架中中介模型的访问字段

Django Rest框架中中介模型的访问字段,django,django-rest-framework,Django,Django Rest Framework,试图从DRF中的中间模型访问字段时遇到困难 让我们看看相关的模型: class School(models.Model): created = models.DateTimeField(auto_now_add=True) name = models.CharField(max_length=50, verbose_name=_(u'Name')) staff_order = models.ManyToManyField(settings.AUTH_USER_MODE

试图从DRF中的中间模型访问字段时遇到困难

让我们看看相关的模型:

class School(models.Model):

    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=50, verbose_name=_(u'Name'))

    staff_order = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_(u'Staff ordering'), through='StaffOrder', related_name='school_staff_order')

class User(AbstractUser):

    phone = models.CharField(max_length=20, blank=True, null=True)
    address = models.CharField(max_length=150, blank=True, null=True)
    about_me = models.CharField(max_length=200, blank=True, null=True)

    REQUIRED_FIELDS = ['email']

    def __unicode__(self):
        return u'{0}'.format(self.username)

class StaffOrder(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    school = models.ForeignKey(School)
    order = models.PositiveSmallIntegerField(default=0, verbose_name=_(u'Staff ordering for this school'))

    class Meta:
        verbose_name_plural = _(u'Staff ordering')
现在我期望的是,当为用户StaffSerializer返回QuerySet时,能够从中的StaffOrder读取order字段。以下是序列化程序:

class StaffRoleSerializer(serializers.ModelSerializer):

    class Meta:
        model = StaffOrder
        fields = (
            'order',
        )


class StaffSerializer(serializers.ModelSerializer):

    username = serializers.CharField(max_length=75, required=True)
    email = serializers.CharField(max_length=75, required=True)
    order = StaffRoleSerializer(source='school_staff_order')

    class Meta:
        model = User
StaffSerializer返回的订单是一个管理器,而不是与此用户相关的StaffOrder模型中的订单字段

员工的预期响应如下所示:

[
  {
    "username": "Denise",
    "email": "deniseburton@maximind.com",
    "order": 9
  },
  {
    "username": "Ina",
    "email": "inaburton@maximind.com",
    "order": 4
  }
]

我也希望能够从序列化程序中写入此值,但我可以在视图集中这样做,但我确实需要在序列化程序本身中读取此值……知道我在这里缺少什么吗?

首先,您必须了解一个用户可以有多个员工订单。在您的模型中,您已经这样定义了它

要获得问题中指定的json输出,需要查询StatForder对象,而不是用户

class StaffOrderSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    email = serializers.CharField(source='user.email')

    class Meta:
        model = StaffOrder
        fields = ('order', )
在列表视图中使用此序列化程序类:

class StaffOrderListApi(generics.ListAPIView):
    serializer_class = StaffOrderSerializer

    def get_queryset(self):
        # using distinct because same user can have multiple staff orders
        # based on your example it seems you want distinct users
        return StaffOrder.objects.all().distinct('user')

这将为您提供您想要的json。

您的命名太混乱了。为什么订单字段上有source=学校\员工\订单?它指的是什么?@zaphod100.10,在序列化程序中映射中间模型时,这似乎是一个要求。它映射到学校中的相关名称。staff\u order字段staff\u order在学校模型中不应该被命名为用户或职员吗?因为它与用户有很多关系。你能给出一个你想要的json的例子吗?@zaphod100.10 staff_order只是一个索引,它知道应该首先显示哪些人员,所以我可能会在得到它以返回正确的值后对它进行排序。我已经进行了更新,因此描述中包含预期的JSON。一个用户不能有一个订单。这是一种多方面的关系。您必须指定查询您想要的订单值。谢谢,但这只是一个更大的应用程序的一部分,我无法返回StaffOrders模型。是的,一个用户在StaffOrder模型中可以有多个条目,因为一个用户可以在N个学校中,并且在每个学校中可能有不同的顺序。关于视图,我使用的视图继承自NestedViewSetMixin和ModelViewSet。正如我所评论的,这是我当前模型的一个非常简单的版本,我不能扔掉我的StaffSerializer并使用您建议的StaffOrderSerializer,但我喜欢这个想法,谢谢: