2013-07-29 10 views
5

Я получаю атрибут AttributeError, когда пытаюсь создать вложенную связь между двумя сериализаторами. Странно то, что я делаю то же самое, что и с другим API, но на этот раз я не работаю. Вот код:AttributeError при использовании вложенных отношений

class UserSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = get_user_model() 
     fields = ('id', 'last_login','username', 'created') 

class NotificationSerializer(serializers.ModelSerializer): 
    user_id = UserSerializer() 

    class Meta: 
     model = Notification 
     fields = ('id', 'user_id', 'type', 'parent_id', 'created', 'modified', 'seen') 

и связанная с ним модель:

class Notification(models.Model): 
    user = models.ForeignKey(User) 
    type = models.CharField(max_length=255) 
    parent_id = models.IntegerField() 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
    seen = models.SmallIntegerField(default=0) 

    def __unicode__(self): 
     return self.type 

    class Meta: 
     db_table = 'notification' 

class User(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length=255, unique=True) 
    id = models.IntegerField(primary_key=True) 
    created = models.DateTimeField(auto_now=True) 
    tag = models.ManyToManyField(Tag) 

    USERNAME_FIELD = 'username' 

    objects = MyUserManager() 

    class Meta: 
     db_table = 'user' 

Ошибка:

Exception Type: AttributeError 
Exception Value:  
'long' object has no attribute 'id' 
Exception Location: /lib/python2.7/site-packages/rest_framework/fields.py in get_component, line 55 

Может кто-нибудь помочь мне с этой ошибкой? Нормальное отношение первичного ключа работает, но я бы определенно хотел бы получить вложенные отношения.

ответ

2

С вашей Notification модель имеет поле под названием user, я думаю, вы должны использовать его вместо user_id:

class NotificationSerializer(serializers.ModelSerializer): 
    user = UserSerializer() 

    class Meta: 
     model = Notification 
     fields = ('id', 'user', 'type', 'parent_id', 'created', 'modified', 'seen') 

Еще одна небольшая заметка вы действительно хотите создать:

id = models.IntegerField(primary_key=True) 

в ваш пользовательский User модель? По умолчанию модель User уже имеет поле под названием id, и это ПК.

+0

Спасибо! Это был трюк. Почему пользовательский идентификатор? Поскольку стандартный генерирует поле с автоинкрементами, и я не хочу автоинкрементный идентификатор. Я устанавливаю идентификатор пользователя вручную (из другой таблицы внешних профилей). Вот почему ;) – Leander

Смежные вопросы