2017-07-11 25 views
0

シリアライザはエラーをスローしませんが、serializer.dataを試してみるといつもAttributeErrorが表示されます: 'str'オブジェクトに '_meta '私は設定されたトレースを行い、タイプが連絡先であることを確認しました。serializer.data throwing AttributeError: 'str'オブジェクトに '_meta'属性がありません

File "/test/user_profile/views.py", line 97, in retrieve 
    return Response(serializer.data) 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/serializers.py", line 531, in data 
    ret = super(Serializer, self).data 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/serializers.py", line 262, in data 
    self._data = self.to_representation(self.instance) 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/serializers.py", line 483, in to_representation 
    fields = self._readable_fields 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/django/utils/functional.py", line 35, in __get__ 
    res = instance.__dict__[self.name] = self.func(instance) 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/serializers.py", line 377, in _readable_fields 
    field for field in self.fields.values() 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/serializers.py", line 363, in fields 
    for key, value in self.get_fields().items(): 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/serializers.py", line 983, in get_fields 
    info = model_meta.get_field_info(model) 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/utils/model_meta.py", line 42 


---------- 


, in get_field_info 
    reverse_relations = _get_reverse_relationships(opts) 
    File "/home/will/virtualenvs/generic_api/lib/python3.5/site-packages/rest_framework/utils/model_meta.py", line 146, in _get_reverse_relationships 
    not get_remote_field(relation.field).through._meta.auto_created 
AttributeError: 'str' object has no attribute '_meta' 

は、ここに私のモデル

class Contact(models.Model): 
    SUBSCRIPTION_LEVEL = { 
     0: 'Both', 
     1: 'Monitoring Event', 
     2: 'DVR Down' 
    } 

    id = models.AutoField(primary_key=True, db_column='Id') 
    user = models.ForeignKey(User, db_column='UserId') 
    title = models.CharField(default='', max_length=20, blank=True, db_column='Title') 
    email_one = models.CharField(default='', max_length=75, blank=True, db_column='EmailOne') 
    email_two = models.CharField(default='', max_length=75, blank=True, db_column='EmailTwo') 
    subscription_level = models.IntegerField(default=0, blank=True, db_column='SubscriptionLevel') 
    phone_one = models.CharField(default='', max_length=15, blank=True, db_column='PhoneOne') 
    phone_two = models.CharField(default='', max_length=15, blank=True, db_column='PhoneTwo') 
    company = models.CharField(default='', max_length=50, blank=True, db_column='Company') 
    notes = models.CharField(default='', max_length=500, blank=True, db_column='Notes') 
    vehicle_description = models.CharField(default='', max_length=200, blank=True, db_column='VehicleDescription') 
    vehicle_plates = models.CharField(default='', max_length=20, blank=True, db_column='VehiclePlates') 
    is_active = models.BooleanField(default=True, blank=False, db_column='IsActive') 

は、ここで私は偶数フィールドを削除し、シリアライザでプレーしてきたビュー

class ContactViewSet(ModelViewSet): 
    permission_classes = (permissions.IsAuthenticated,) 
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) 
    serializer_class = ContactSerializer 

    def retrieve(self, request, pk=None): 
     queryset = Contact.objects.filter(is_active=True) 

     if not self.request.user.is_staff: 
      queryset = queryset.filter(contacts__user_id=self.request.user.id) 

     contact = get_object_or_404(queryset, id=pk) 
     serializer = ContactSerializer(contact) 
     return Response(serializer.data) 

そして、私のシリアライザ

class ContactSerializer(serializers.ModelSerializer): 
    first_name = serializers.CharField(source='user.first_name', required=False) 
    last_name = serializers.CharField(source='user.last_name', required=False) 

    class Meta: 
     model = Contact 
     fields = ['id', 'user', 'first_name', 'last_name', 'title', 'email_one', 'email_two', 'company', 'notes', 'subscription_level', 
        'phone_one', 'phone_two', 'vehicle_description', 'vehicle_plates', 'is_active'] 

だですまたは単にfiを設定するelds = 'すべて'ですが、なぜこれが起こっているのか理解できませんでした。

答えて

0

コードは私によく見えます。 何とかシリアライザが、多対多または多対多のキーの関係を逆にするのに失敗しているようです。 障害のあるフィールドを特定できましたか?

+1

実際には私が存在していないということもManyToManyだったことが判明しました。私は連絡先のインフラストラクチャを書き直しましたが、このモデル名を保持しました。過去の開発者によるひどい設計のため、一部のモデルは実際にはビューであるため、定期的な移行は実行できません。だから私はそれにデータをも持っていないいくつかのあいまいなモデルのリファレンスを見逃していました。 –

+0

あなたは根本的な原因を見つけてうれしいです。 – Linovia

関連する問題