0

Ich baue eine django Rest API zum Speichern/Verwalten von Kundendaten für mein Projekt. Ich habe zwei Modelle. Kunde zum Speichern grundlegender Kundendaten und Kundendetails zum Speichern einer Reihe von Kundendetails. Ich möchte eine einzelne API schreiben, um Daten für beide Modelle zu erstellen/zu aktualisieren.django rest framework: Objekt vom Typ 'NoneType' hat kein len() beim Aufruf get Methode der zugehörigen Tabelle

Jetzt speichert mein Code die Benutzerdaten. Aber jetzt kann ich die Kundendaten nicht bekommen. Wenn ich die Methode get aufrufen, tritt der folgende Fehler auf.

TypeError at /api/v1/customer 
object of type 'NoneType' has no len() 
Request Method: GET 
Request URL: http://127.0.0.1:8000/api/v1/customer 

Auch Muss ich nichts extra tun, um diesen Code für updation zu verwenden (PUT)

urls.py

router.register(r'customer', views.CustomerViewSet, 'customers') 

models.py

class Customer(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    name = models.CharField(max_length=20) 
    address = models.CharField(max_length=50) 
    city = models.CharField(max_length=256) 
    """some more fields to go""" 


# Create your models here. 
class CustomerDetails(models.Model): 
    customer = models.OneToOneField(Customer, on_delete=models.CASCADE, primary_key=True,) 

    spouse_name = models.CharField(max_length=256) 
    interests = models.CharField(max_length=256) 
    """many more fields to go""" 

Serializer .py

class CustomerDetailsSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = CustomerDetails 
     fields = ('spouse_name',) 


class CustomerSerializer(serializers.ModelSerializer): 
    customer_details = CustomerDetailsSerializer(required=True) 
    class Meta: 
     model = Customer 
     fields = ('name', 'city', 'customer_details',) 

    def create(self, validated_data): 
     request = self.context.get('request') 
     user = request.user 
     # create user 
     customer = Customer.objects.create(
      user = user, 
      name = validated_data['name'], 
      city = validated_data['city'], 
      # etc ... 
     ) 
     print(json.dumps(validated_data, indent=4)) 
     customer_details_data = validated_data.pop('customer_details') 
     # create profile 
     customer_details = CustomerDetails.objects.create(
      customer = customer, 
      spouse_name = customer_details_data['spouse_name'], 

     ) 
     customer.customer_details = customer_details_data; 
     return customer 


class CustomerListSerializer(serializers.ModelSerializer): 
    model = Customer 
    customer_details = CustomerDetailsSerializer() 
    class Meta: 
     model = Customer 
     fields = '__all__' 

views.py

class CustomerViewSet(viewsets.ModelViewSet): 
    customer_photo_thumb = Customer.get_thumbnail_url 
    customer_details = '' 
    permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope] 
    queryset = Customer.objects.all() 
    serializer_class = CustomerSerializer 

    def get_queryset(self): 
     queryset = Customer.objects.all() 

    def get_serializer_class(self): 
     if self.action == 'list' or self.action == 'retrieve': 
      return CustomerListSerializer 
     return CustomerListSerializer 
+0

Bitte fügen Sie die vollständige Stack-Trace –

+0

komplette Stacktrace: http://pastebin.com/K17QmM91 –

Antwort

2

.get_queryset Ihre Methode zurückgeben None wie folgt ersetzen:

def get_queryset(self): 
    return Customer.objects.all() 

In der Tat Ihre get_queryset Methode ist, da das queryset Attribut nicht ändert nicht erforderlich.

+0

hat es funktioniert. Vielen Dank. Jetzt gibt es nur die Kundendaten zurück. Gibt es eine Möglichkeit, die Kundendaten zusammen mit den Ergebnissen zurückzugeben? –

Verwandte Themen