2013-07-29 8 views
5

Ich erhalte einen AttributeError, wenn ich versuche, eine verschachtelte Beziehung zwischen zwei Serialisern zu erstellen. Das Seltsame ist, dass ich genau das Gleiche mache wie mit einer anderen API, aber dieses Mal funktioniert es nicht. Hier ist der Code:AttributeError bei Verwendung verschachtelter Relationen

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') 

und die dazugehörigen Modelle:

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' 

Der Fehler:

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 

mir jemand kann mit diesem Fehler helfen? Eine normale Primärschlüssel-Beziehung funktioniert, aber ich möchte definitiv eine verschachtelte Beziehung bekommen.

Antwort

2

Da Ihr Notification Modell hat ein Feld user genannt, ich glaube, Sie es statt user_id verwenden sollte:

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

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

Noch ein kleiner Hinweis ist wollen Sie wirklich schaffen: in

id = models.IntegerField(primary_key=True) 

Ihre benutzerdefinierte User Modell? Standardmäßig hat ein User Modell bereits ein Feld namens id und es ist der PK.

+0

Danke! Das war der Trick. Warum eine benutzerdefinierte ID? Weil der Standard ein automatisch inkrementelles Feld erzeugt und ich keine automatische inkrementelle ID möchte. Ich habe die Benutzer-ID manuell festgelegt (aus einer anderen externen Tabelle). Deshalb ;) – Leander

Verwandte Themen