2017-07-11 5 views
0

Mein Serializer wirft keinen Fehler, aber jedes Mal, wenn ich versuche, serializer.data zu verwenden, bekomme ich AttributeError: 'str' Objekt hat kein Attribut '_meta ". Ich habe eine Set-Spur gemacht und bestätigt, dass der Typ Contact ist.serializer.data werfen AttributeError: 'str' Objekt hat kein Attribut '_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' 

Hier ist mein Modell

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

Hier ist der Ansicht

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) 

Und mein Serializer

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

Ich habe mit dem Serializer spielen, auch die Felder zu entfernen oder einfach fi einstellen elds = 'alle' aber ich konnte nicht herausfinden, warum das passiert.

Antwort

0

Der Code sieht gut aus. Irgendwie scheint es, dass der Serializer eine umgekehrte Beziehung von vielen zu vielen oder Fremdschlüsseln versäumt. Haben Sie es geschafft, das fehlerhafte Feld zu erkennen?

+1

Es stellt sich heraus, dass es in der Tat ein ManyToMany war, von dem ich keine Ahnung hatte, dass es überhaupt existierte. Ich hatte unsere Kontaktinfrastruktur umgeschrieben, behielt aber diesen Modellnamen. Aufgrund des schrecklichen Designs von Entwicklern kann ich keine reguläre Migration durchführen, da einige der Modelle tatsächlich nur Ansichten sind. Also habe ich eine Referenz in einem obskuren Model verpasst, das nicht einmal Daten enthielt. –

+0

froh, dass Sie die Ursache finden. – Linovia

Verwandte Themen