【发布时间】:2017-05-22 14:19:55
【问题描述】:
尝试从 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')
现在我期望在为用户返回 QuerySet 时能够从 StaffOrder 中读取订单字段(StaffSerializer)。以下是序列化程序:
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 模型中的订单字段。
Staff 的 JSON 预期响应是这样的:
[
{
"username": "Denise",
"email": "deniseburton@maximind.com",
"order": 9
},
{
"username": "Ina",
"email": "inaburton@maximind.com",
"order": 4
}
]
我也希望能够从序列化程序中写入这个值,但我可以在 Viewset 中做到这一点,但我真的需要在序列化程序本身中读取这个值......知道我错过了什么在这里?
【问题讨论】:
-
你的命名太混乱了。为什么订单字段上有 source=school_staff_order ?它指的是什么?
-
@zaphod100.10 这似乎是在序列化程序中映射中间模型时的要求。它映射到 School.staff_order 中的相关名称
-
在学校模型上字段
staff_order不应该命名为users或staff吗?因为它与用户是多方面的关系。你能举一个你想要的json的例子吗? -
@zaphod100.10 staff_order 只是一个知道应该首先显示哪些员工的索引,所以一旦我得到它,我可能会对其进行排序以返回正确的值。我已更新,因此描述中包含预期的 JSON
-
一个用户不能有一个订单。这是一个多方面的关系。您必须指定查询您想要的订单值。
标签: django django-rest-framework