如何获取继承模型的字段?

时间:2014-10-11 16:37:39

标签: python django python-3.x

请帮助解决问题。

我有一个模特:

class UserProfile(User):            
    gender = models.ForeignKey(
        Gender,
        verbose_name='Пол',
        blank=True,
        null=True,
    )
    nickname = models.CharField(
        'Отображаемое имя',
        max_length=50, 
        blank=False,
    )   
    phone = models.CharField(
        max_length=50, 
        blank=False,
    )
    skype = models.CharField(
        max_length=50, 
        blank=False,
    )   
    other = models.TextField(
        max_length=500,
        blank=False,
    )
    avatar = models.ImageField(
        upload_to='userprofile/avatar/', 
        blank=True,
        null=True,
    )

    objects = UserManager()

    @classmethod
    def get_new_authors_entries(self, cut_begin=0, cut_end=2):
        return self.objects.filter(is_active=1, is_superuser=0)[cut_begin:cut_end]  

方法get_new_authors_entries()返回以下字段:

[
    {
        "fields": 
            {
                "skype": "dfsdf", 
                "user_permissions": [], 
                "other": "zzzz", 
                "nickname": "\u0418\u0432\u0430\u043d \u0422\u0443\u0440\u0433\u0435\u043d\u0435\u0432 \u0451\u043f\u0442\u0430", 
                "gender": 1, 
                "avatar": "", 
                "phone": "2014-0921", 
                "groups": []
            }, 

        "model": "app_accounts.userprofile", 
        "pk": 4
    }, 

    .....,
    .....,
    ....
] 

但我需要获取字段的值:' date_joined','用户名','电子邮件'

UserProfile继承自User。我没有理由无法访问这些字段:' date_joined','用户名','电子邮件'

views.py(片段):

new_authors = UserProfile.get_new_authors_entries(cut_begin=page_new_authors, cut_end=page_new_authors + 2)

result = serializers.serialize('json', new_authors)

return HttpResponse(json.dumps(result), content_type='application/json')    

2 个答案:

答案 0 :(得分:0)

我建议不要继承用户,而是将配置文件设置为具有对用户的外键引用的自己的模型。无论哪种方式,您没有看到任何用户模型字段的原因是因为默认情况下序列化程序不执行"深度序列化"。您必须实现适当序列化的自定义序列化程序。

如果你想要一个可以开始的地方,请看看汤姆克里斯蒂的旧解决方案:https://github.com/tomchristie/django-serializers

如今,大部分内容都包含在django-rest-framework中。恕我直言,对于简单的用例,使用标准的json模块滚动自己的序列化器并不算太多。它还可以让您完全控制结果json的结构,这可能很好。最新版本的Django甚至还有一个内置的JsonResponse,因此您可以执行以下操作:

    #at the end of your view
    import json
    response_data = json.dumps(serialize_data(user,profile))
    return JsonResponse(response_data, status=200)

def serialize_data(user, profile):

    my_dict = {
        'username': user.username,
        'date_joined': user.date_joined
        #... and so on
    }

    return my_dict

答案 1 :(得分:0)

也许是因为这是一个类方法所以它应该接收cls并使用cls而不是self。