Невозможно назначить ":" Mov ie .owner "должен быть экземпляром" Suppliers " - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь назначить владельца как объект, и я должен делать это неправильно, потому что он все еще вызывает

Cannot assign "<User: kdkd@gmail.com>": "Movie.owner" must be a "Suppliers" instance.

Метод запроса: POST

Это мой сериализатор для моего Модель Mov ie.

class MovieTicketSerializer(serializers.ModelSerializer):
    class Meta:
        model = Movie
        fields = ['owner', 'title', 'price', 'date', 'description', 'seat', 'choice', 'active']

def create(self, validated_data):
    owner = self.context['request'].user
    movie = Movie.objects.create(owner=owner, active=True, **validated_data)
    return movie

И это вид

@api_view(['POST', ])
@permission_classes([IsAuthenticated, ])
def movie_ticket_detail(request):
    if request.method == 'POST':
        serializer = MoveTicketSerializer(data=request.data, context={'request': request})
        data = {}
        if serializer.is_valid():
            ticket = serializer.save()
            data['request'] = ' ticket is instantiated '
            data['title'] = ticket.title
            data['owner'] = ticket.owner
        else:
            data = serializer.errors
        return Response(data)

class TicketModel(models.Model):
owner = models.ForeignKey(Suppliers, on_delete=models.CASCADE,  null=True)
title = models.CharField(max_length=30, default='TICKET')
price = models.IntegerField()
date = models.CharField(max_length=20)
description = models.TextField(max_length=300, blank=False)
posted = models.DateTimeField(default=now, editable=False)
active = models.BooleanField(default=False)

class Meta:
    abstract = True


class Movie(TicketModel):
    seat = models.IntegerField(null=True)
    choice = models.IntegerField(choices=TYPE_OF_MOVIES_CONCERT_OTHERS, default=1)

    def __repr__(self):
        return {'title': self.title, 'price': self.price, 'description': self.description, 'date': self.date}

Ответы [ 2 ]

0 голосов
/ 14 января 2020
def create(self, validated_data):
    owner = Suppliers.objects.get(email=self.context['request'].user)
    movie = Movie.objects.create(owner=owner, active=True, **validated_data)
    return HttpResponse(movie, content_type="text/json-comment-filtered")

что-то не так с такой реализацией. оно работает.

0 голосов
/ 11 января 2020

Вы не можете вернуть экземпляры модели или запрос, вместо этого вам нужно вернуть собственный python тип данных в формате json, xml или другие типы содержимого. Сначала создайте Serialzier

 class SupplierSerializer(ModelSerializer):
        class Meta:
            model = Supplier
            fields = '__all__' # Or sepecific fields ['id','name']

Затем используйте сериализатор, как показано ниже.

# you need to get Supplier object 
supplier_obj = get_object_or_404(Supplier,user=ticket.owner)
data['owner'] = SupplierSerializer(supplier_obj).data

ИЛИ

supplier_obj = get_object_or_404(Supplier,user=ticket.owner)

data['owner'] = supplier_obj.id # just return id
...