无法在django外键序列化中使用自然键

时间:2013-03-30 11:52:08

标签: django serialization foreign-keys natural-key

所以问题是我有一个有外键的类。

这是我的代码

class Proxy(models.Model):
  class Meta:
    db_table = 'Proxy'
  equipment = models.ForeignKey('Equipment', primary_key=True)      
  pop = models.ForeignKey('Pop')

现在,像往常一样

import django.core.serializers as Serializer
res = Proxy.objects.filter(equipment_id__exact='eq1')
Serializer.serialize('json', res)

json输出包含Pop的“id”而不是我想要的名称。

所以我使用了Manager类,这是我的Pop类 -

class PopManager(models.Manager):
  def get_by_natural_key(self, name):
    return self.get(name=name)

class Pop(models.Model):
  POP_TYPES = (
    ('phy','phy'),
    ('cloud','cloud'),
  )

  class Meta:
    db_table = 'Pop'
    unique_together = ('name', 'vip')
  objects = PopManager()
  name = models.CharField(max_length=10)
  type = models.CharField(max_length=10, choices=POP_TYPES)

  def natural_key(self):
    return (self.name)

但在此之后,当我做的时候

res = Proxy.objects.filter(equipment_id__exact='eq1')
Serializer.serialize('json', res, use_natural_keys=True)

我收到错误, TypeError:设备:eq1不是JSON可序列化的

我也尝试过wadofstuff这个外键的序列化,但显然在Django1.5中,simplejson和json之间存在冲突,并且查询引发了错误。所以我回到原点。

任何帮助都会受到高度赞赏。我已经把头发分开了几个小时。

2 个答案:

答案 0 :(得分:0)

无论如何,所以我通过将QuerySet转换为原始字典类型格式来解决这个问题。我在过滤后附加了一个值子句。并循环遍历整个queryset返回以生成字典列表。其余的很容易。

答案 1 :(得分:0)

Agniva,

您只需删除自己的行:

db_table ='Pop'