推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
guolingbing
V2EX  ›  Python

不懂就要问系列, django restframework

  •  
  •   guolingbing · Feb 27, 2017 · 3589 views
  •   You need to sign in to view this topic
    This topic created in 3438 days ago, the information mentioned may be changed or developed.
    我又来问 dalao 们问题了
    这几天一直在仔细看 restframework 的文档,手上也有一个项目正在写,但以前是 func_view 的,正在慢慢改成 class_view 的

    现在有个问题是关于 Serializer 的,比如说都要返回 User 信息
    游客、本人以及好友可能看到的信息是不一样的
    我现在的做法是通过定义一个基础 UserSerializer ,再继承它对 fields 作限制,
    但是这样另一个问题是 嵌套问题, 比如 User 关联了 Profile , Profile 也要根据身份区别返回
    ,这样就要分别定制一堆 Serializer 。

    另外我知道一个 HyperLinkModelSerializer ,但目前我需要返回嵌套形式的属性

    求大佬们指导啊
    7 replies    2017-03-01 09:47:41 +08:00
    phithon
        1
    phithon  
       Feb 27, 2017   ❤️ 1
    在 View 里定义 queryset 的时候就做区分。
    if request.user.is_authenticated:
    models.Post.objects.all()
    else:
    models.Post.objects.filter(type='public').all()
    phithon
        2
    phithon  
       Feb 27, 2017
    关联的,不太好处理,可以选择在 serializer 的__init__里修改这个关联 fields 的 queryset 值。
    newlife
        3
    newlife  
       Feb 27, 2017   ❤️ 1
    你这个需要运行时确定返回数据, request 对象要参与数据生成的,直接重写 get_queryset 吧
    siteshen
        4
    siteshen  
       Feb 28, 2017   ❤️ 1
    下面我用的一种方式, DRF 应该有类似的自定义机制

    ```
    class UserSerializer(object):

    fields = ['username', 'profile', 'is_member']

    def serialize_field(self, field):
    func = getattr('serialize_field_%s' % field, None)
    if func:
    return self.func()

    return super(UserSerializer, self).serialize_field()

    def serialize_field_profile(self):
    return {
    'private': 'private property',
    'public': 'public property',
    }


    class GuestUserSerializer(UserSerializer):
    fields = ['username', 'profile']

    def serialize_field_profile(self):
    return {'public': 'public property'}
    ```
    guolingbing
        5
    guolingbing  
    OP
       Mar 1, 2017
    @siteshen
    对的,我目前就用的这种方法,前两天太忙了都没上 V 站, restframework 里讲 Serializer 部分有一个就是 DynamicSerializer ,可以在生成 Serializer 时传入 fields 和 exclude 等字段
    guolingbing
        6
    guolingbing  
    OP
       Mar 1, 2017
    @newlife 好的,我再看看, 前两天有些忙都没时间回复
    guolingbing
        7
    guolingbing  
    OP
       Mar 1, 2017
    @phithon 这个我还没看过,一会看看~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5855 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:04 · PVG 10:04 · LAX 19:04 · JFK 22:04
    ♥ Do have faith in what you're doing.