2013-05-13 49 views
0

我有一个模型,EntryForeign KeyauthorUser类型:更改JSON序列外国的字符串表示主要

author = models.ForeignKey(User, default=None) 

我定期使用AJAX轮询服务器,并有一个返回任何新Entry视图响应中的对象,以JSON格式序列化。下面是代码:

def pollNewEntries(request): 
    if request.method == 'GET': 
     delta = datetime.timedelta(seconds=19) 

     # Determine if there are any new posts since 19 seconds before current 
     # time. AJAX polls server every 10 seconds. Stores ids of new posts and 
     # checks those against any incoming posts, ignoring duplicates. 

     cutOff = timezone.now() - delta 
     newEntries = Entry.objects.filter(pubDate__gt=cutOff) 
     data = serializers.serialize('json', newEntries) 
     return HttpResponse(data, mimetype='application/json') 

这将返回完全没问题的所有数据我Entry领域的休息,但在我的JavaScript时,我动态登录/打印/追加Entry.author,它给了我的作者的ID字段。我检查了JS中的序列化对象,并且author中没有其他字段可以获取。

有没有办法改变序列化数据中代表author的部分内容?基本上,我希望我的视图返回author字段有author.name而不是author.id的JSON对象。

+0

默认情况下,它会序列化数据库表中的内容。并且在数据库中,它将它作为一个整数字段存储,该字段具有外键“author”的编号 – karthikr 2013-05-13 13:44:54

+0

您的作者应该位于newEntries.author.name。 – 2013-05-13 13:45:04

+0

尝试使用django-rest-framework http://django-rest-framework.org/ – EsseTi 2013-05-13 13:47:43

回答

0

看来,如果你define a natural key

from django.db import models 

class PersonManager(models.Manager): 
    def get_by_natural_key(self, first_name, last_name): 
     return self.get(name=first_name) 

class Person(models.Model): 
    objects = PersonManager() 

    name = models.CharField(max_length=100) 

    birthdate = models.DateField() 

class Meta: 
    unique_together = (('name'),) 

你就可以达到你想要的东西。

+0

这是我需要的,谢谢。尽管如此,为了完整起见,你应该在你想要序列化的类中有一个“def natural_key(self)”函数,它返回一个你想要的自然键的元组。另外,当你调用'serialize'方法时,你需要设置'use_natural_keys = True'。最后,如果你使用'User'模型(就像我),你不需要做任何管理器/自定义方法的东西。自然键逻辑已经建立在使用用户名作为自然键的情况下,所以当你调用'serialize()'时,你只需要设置'use_natural_keys = True'。这些都在上面的Django文档中 – 2013-05-13 14:44:47