Проводка объектов с уже существующими вложенными объектами в Django Rest Framework - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над кодом, который взаимодействует с API моего сайта, но у меня есть некоторые проблемы с Django Rest Framework. Я пытаюсь отправить почтовый запрос на сервер, чтобы создать нового персонажа на основе модели, сериализатора и набора представлений ниже.


####################Serializer####################################

class CharacterSerializer(serializers.HyperlinkedModelSerializer):
    relatedTo = PlayerSerializer();

    class Meta:
        model = Character
        fields = '__all__'

#####################################Model#############################################

class Character(models.Model):
    characterID = models.CharField(max_length=500);
    lastLogin = models.DateTimeField();
    relatedTo = models.ForeignKey(Player, on_delete=models.CASCADE)
    shouldRun = models.BooleanField(default=True, null=True, blank=True);

    def __str__(self):
        return self.relatedTo.name + ": " + self.characterID;

    def save(self, *args, **kwargs):
        if self.relatedTo.lastLogin != None:
            self.relatedTo.lastLogin = self.lastLogin;
        else:
            if self.lastLogin > self.relatedTo.lastLogin:
                self.relatedTo.lastLogin = self.lastLogin;
                self.shouldRun = True;
            else:
                self.shouldRun = False;
        super().save(*args, **kwargs)

######################################ViewSet########################################

class CharacterViewSet(viewsets.ModelViewSet):
    queryset = Character.objects.all()
    serializer_class = CharacterSerializer

    def get_queryset(self):
        queryset = Character.objects.all();
        shouldRun = self.request.query_params.get('shouldRun', None)
        charID = self.request.query_params.get('charID', None)
        name = self.request.query_params.get('name', None)
        if charID is not None:
                queryset = queryset.filter(characterID=charID);
        if shouldRun is not None:
            queryset = queryset.filter(shouldRun=shouldRun);
        if name is not None:
            queryset = queryset.filter(relatedTo__name=name);
        return queryset;

Проблема заключается в том, что я должен включить объект Player, с которым связан персонаж, при публикации объекта. Я также включил информацию об игроке ниже.


####################Serializer####################################

class PlayerSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Player
        fields = '__all__'

#####################################Model#############################################

class Player(models.Model):
    tags = models.IntegerField(default=0, null=True, blank=True);
    tabs = models.IntegerField(default=0, null=True, blank=True);
    points = models.IntegerField(default=0, null=True, blank=True);
    membershipId = models.CharField(max_length=500);
    membershipType = models.CharField(max_length=500);
    memberType = models.CharField(max_length=500);
    name = models.CharField(max_length=500);
    slug = models.SlugField(max_length=50, unique=True, null=True, blank=True);
    lastLogin = models.DateTimeField(blank=True, null=True);

    def _get_unique_slug(self):
        slug = slugify(self.name)
        unique_slug = slug
        num = 1
        while Player.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, num)
            num += 1
        return unique_slug

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = self._get_unique_slug()
        super().save(*args, **kwargs)       

    def __str__(self):
        return self.name

######################################ViewSet########################################

class PlayerViewSet(viewsets.ModelViewSet):
    queryset = Player.objects.all()
    serializer_class = PlayerSerializer

    def get_queryset(self):
        queryset = Player.objects.all();
        user = self.request.query_params.get('name', None)
        if user is not None:
            queryset = queryset.filter(name=user);
        return queryset;

При попытке опубликовать любой символ появляется сообщение об ошибке, в котором говорится, что поле relatedTo является обязательным, несмотря на то, что оно включено в запрос на публикацию. Я пробовал множество различных способов включить его в запрос post, включая передачу URL объекта Player, его имени, слага и даже самого объекта. Однако ничего не получилось, и я всегда получаю одно и то же сообщение об ошибке каждый раз. Я просмотрел некоторые другие учебники и вопросы и ответы здесь, но все, что я могу найти, это примеры, когда люди создают как обычный объект, так и вложенный объект при вызове post, тогда как я просто хотите создать объект персонажа и связать его с уже существующим персонажем. Любая помощь будет принята с благодарностью, и я могу опубликовать больше кода, если это необходимо.

...