Django Rest框架中中介模型的访问字段
试图从DRF中的中间模型访问字段时遇到困难 让我们看看相关的模型: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
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,但我喜欢这个想法,谢谢: