2013-03-30 3 views
1

Итак, у меня есть класс, который имеет внешний ключ.Невозможно использовать естественные ключи в сериализации внешнего ключа 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 содержит «идентификатор» из поп-музыки, а не имя, которое я хочу.

Таким образом, я использовал класс Manager, и это мой класс Поп сейчас-

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 serializable

Я также пробовал wadofstuff для этой сериализации внешних ключей, но, по-видимому, в Django1.5, есть столкновение между simplejson и json, и запрос выдавал ошибку. Поэтому я вернулся на круги своя.

Любая помощь будет высокоприобретенной. Я часами раскалываю волосы.

+0

вместо '' res' в сериализации() '' попробовать список (Рез) '. –

+0

Да, я сделал это уже. Тот же результат. –

ответ

0

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

0

Agniva,

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

db_table = 'Pop'