Невозможно использовать естественные ключи в сериализации внешнего ключа django

Дело в том, что у меня есть класс с внешним ключом.

Это мой код

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 содержит "id" Pop, а не имя, которое я хочу.

Итак, я использовал класс 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 ответа

В любом случае, я решил эту проблему, преобразовав QuerySet в формат необработанного словаря. Я добавил предложение значений после фильтра. И перебрал весь набор запросов, возвращенный, чтобы составить список словарей. Остальное было легко.

Agniva,

Вам просто нужно удалить свою строку:

db_table = 'Pop'

Другие вопросы по тегам