Не удается сохранить модель Django с внешним ключом - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь отправить запрос POST с моего внешнего интерфейса, чтобы добавить новую запись «Достижения».Запись достижений имеет поле внешнего ключа, относящееся к набору, который содержит множество достижений.Однако при попытке сохранить я получаю сообщение об ошибке: "{" set ": [" Неверный тип.Ожидаемый объект идентификатора ресурса, получен Set. "]}" Я не знаю, что такое "тип идентификатора ресурса", и не могу найти в нем никаких документов при поиске в Интернете.Вот мои данные POST-запроса: {"достижение": {"title": "Rails - это Omakase", "description": "Lorem ipsum", "experience": 100, "set": "52"}}

Я пытался установить "set" для идентификатора набора и экземпляра сериализатора "Set" перед сохранением.

Serializers.py

class SetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Set
        fields = ('id', 'title', 'description')

class AchievementSerializer(serializers.ModelSerializer):
    class Meta:
        model = Achievement
        fields = ('id', 'title', 'description', 'experience', 'set')

models.py

class Set(models.Model):
    title = models.CharField(max_length=100, blank=False)
    description = models.TextField()

    class JSONAPIMeta:
        resource_name = "sets"

class Achievement(models.Model):
    title = models.CharField(max_length=100, blank=False)
    description = models.TextField()
    experience = models.IntegerField()
    set = models.ForeignKey(Set, on_delete=models.CASCADE, related_name="achievements")

views.py

class AchievementList(APIView):
    def post(self, request):
        data = request.data["achievement"]
        setId = data["set"]
        set = Set.objects.get(pk=setId)
        data["set"] = set
        serializer = AchievementSerializer(data=data)

        if serializer.is_valid():
            serializer.save()
            return JsonResponse({"achievement":serializer.data}, safe=False)
        return JsonResponse(serializer.errors, status=400)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Если вы оставите свой post только на этом:

def post(self, request):
    data = request.data["achievement"]

    serializer = AchievementSerializer(data=data)

    if serializer.is_valid():
        serializer.save()
        return JsonResponse({"achievement":serializer.data}, safe=False)
    return JsonResponse(serializer.errors, status=400)

Тогда у меня не было проблем с его запуском. Как правило, первичный ключ ожидается для объекта. Я использовал следующий тест:

class TestAchievementList(TestCase):
    def test_add_achievement(self):
        title = 'title'
        description = 'desc'
        experience = 1
        set_object = Set.objects.create(title='new set')

        json = {
            'achievement': {
                'title': title,
                'description': description,
                'experience': experience,
                'set': set_object.id
            }
        }

        url = reverse('achievements')

        response = self.client.post(url, data=json, content_type='application/json')

        self.assertEqual(response.status_code, 200)
        self.assertIn('achievement', response.json())

        achievement_json = response.json()['achievement']

        self.assertEqual(achievement_json['title'], title)
        self.assertEqual(achievement_json['description'], description)
        self.assertEqual(achievement_json['experience'], experience)
        self.assertEqual(achievement_json['set'], set_object.id)
0 голосов
/ 13 июня 2019

Я нашел решение, прочитав несколько документов JSON: https://jsonapi.org/format/#document-resource-identifier-objects. В сообщении об ошибке указывалось, что он хотел передать объект идентификатора ресурса для ключа "set".Объект идентификатора ресурса - это просто объект, который содержит члены типа и идентификатора.Таким образом, я гарантирую, что у набора были элементы type и id, и это решило проблему.Таким образом, мой новый почтовый запрос выглядит следующим образом: {"достижение": {"title": "Rails - это Omakase", "description": "Lorem ipsum", "experience": 100, "set": {"type":"наборы", "Идентификация": "4"}}}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...