django rest框架动态相关对象

django rest框架动态相关对象,django,django-rest-framework,Django,Django Rest Framework,问题-我有一个使用django REST框架的REST服务器(django v1.7.7,django REST框架v3.1.1)。在通知中,我会让用户知道他们是否收到了新的好友请求,或者是否获得了新的徽章。还有其他通知类型,但这个简单的示例可以解释我的问题 在我的GET响应中,我希望获得带有动态相关对象的通知,该对象由类型决定。如果类型是friendreq,那么我希望relatedObject是一个带有UserSerializer的用户实例。如果类型是badge,我希望relatedObjec

问题-我有一个使用django REST框架的REST服务器(django v1.7.7,django REST框架v3.1.1)。在通知中,我会让用户知道他们是否收到了新的好友请求,或者是否获得了新的徽章。还有其他通知类型,但这个简单的示例可以解释我的问题

在我的GET响应中,我希望获得带有动态相关对象的通知,该对象由类型决定。如果类型是
friendreq
,那么我希望relatedObject是一个带有UserSerializer的用户实例。如果类型是badge,我希望relatedObject是一个带有BadgeSerializer的badge实例

注意:我已经有了这些其他序列化程序(UserSerializer、BadgeSerializer)

以下是我希望在回应中实现的目标:

{
    "id": 1,
    "title": "Some Title",
    "type": "friendreq"
    "relatedObject": {
        // this is the User instance. For badge it would be a Badge instance
        "id": 1,
        "username": "foo",
        "email": "foo@bar.com",
    }
}
以下是关于模型和序列化程序的内容:

# models.py
class Notification(models.Model):
    """
    Notifications are sent to users to let them know about something. The 
    notifications will be about earning a badge, receiving friend request,
    or a special message from the site admins.
    """
    TYPE_CHOICES = (
        ('badge', 'badge'),
        ('friendreq', 'friend request'),
        ('system', 'system'),
    )
    title = models.CharField(max_length=30)
    type = models.CharField(max_length=10, choices=TYPE_CHOICES)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="user")
    related_id = models.PositiveIntegerField(null=True, blank=True)


# serializers.py
class NotificationSerializer(serializers.ModelSerializer):
    if self.type == "badge":
        related_object = BadgeSerializer(
            read_only=True,
            queryset=Badge.objects.get(id=self.related_id)
        )
    elif self.type == "friendreq":
        related_object = FriendRequestSerializer(
            read_only=True,
            queryset=FriendRequest.objects.get(id=self.related_id)
        )

    class Meta:
        model = Notification
这段代码不起作用,但希望它能解释我试图完成的任务和我努力的方向。也许这个方向是完全错误的,我应该尝试用其他方法来实现这一点


我尝试的另一个选项是使用
SerializerMethodField
并在一个方法中执行此操作,但对于尝试基于另一个字段返回序列化对象的情况来说,这似乎没有那么干净。

我相信您要使用的是
.to\u表示()
在DRF文档中提到的方法:

是的,这正是我所需要的,我现在已经可以使用了。谢谢