2013-07-29 31 views
5

Tôi nhận được AttributeError khi cố tạo mối quan hệ lồng nhau giữa hai serializers. Điều kỳ lạ là tôi đang làm chính xác điều tương tự như với một API khác, nhưng lần này tôi không làm cho nó hoạt động. Đây là mã:Thuộc tínhError khi sử dụng quan hệ lồng nhau

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

Và các mô hình liên quan:

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' 

Lỗi:

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 

bất cứ ai có thể giúp tôi với lỗi này? Một mối quan hệ khóa chính bình thường hoạt động, nhưng tôi chắc chắn muốn có được một mối quan hệ lồng nhau.

Trả lời

2

Kể từ khi mô hình Notification của bạn có một lĩnh vực được gọi user, tôi nghĩ rằng bạn nên sử dụng nó thay vì user_id:

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

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

Một lưu ý nhỏ là bạn có thực sự muốn tạo:

id = models.IntegerField(primary_key=True) 

trong mô hình User tùy chỉnh của bạn? Theo mặc định, mô hình User đã có một trường có tên là id và đó là PK.

+0

Cảm ơn! Đó là mẹo. Tại sao id tùy chỉnh? Bởi vì tiêu chuẩn tạo ra một trường tự động gia tăng và tôi không muốn một id tự động gia tăng. Tôi đặt ID người dùng theo cách thủ công (từ một bảng hồ sơ bên ngoài khác). Đó là lý do tại sao;) – Leander

Các vấn đề liên quan