Ошибка целостности в поле внешнего ключа django в django-rest-framework - PullRequest
0 голосов
/ 27 мая 2019

Я довольно новичок в Джанго.У меня есть поле Foreignkey в качестве супервизора, как показано ниже

class Site(models.Model):
sitename=models.CharField(max_length=255)
start_date=models.DateTimeField
supervisor=models.ForeignKey(User,on_delete=models.PROTECT)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

def __str__(self):
    return "{}".format(self.sitename)

Сериализатор для этого:

class SiteSerializer(serializers.ModelSerializer):

supervisor = serializers.ReadOnlyField(source='supervisor.username')

class Meta:
    model = Site
    fields = ('sitename', 'start_date', 'supervisor') 

, и представление для этого:

@csrf_exempt
def site_list(request):
    """
    List all code snippets, or create a new snippet.
    """
    if request.method == 'GET':
        sites = Site.objects.all()
        serializer = SiteSerializer(sites, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':

    data = JSONParser().parse(request)


    serializer = SiteSerializer(data=data)

    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

Всякий раз, когда я публикую данные от почтальона, он говорит: IntegrityError at /sites/ (1048, "Column 'supervisor_id' cannot be null") Я назвал поле модели супервизором, а поле db становится supervisor_id, как это делает django.Но как мне разобраться с этой ошибкой?Это может быть действительно мелочь, но я не мог понять, где сделать необходимые корректировки.Пожалуйста, помогите.

Мой пост-запрос { "sitename" : "Tony Tower", "start_date" :"2019-5-5", "supervisor" : "1" } ИЛИ

{
"sitename" : "Putalisadak",
"start_date" :"2019-5-5",
"supervisor_id" : "1"
}

оба дают одинаковый вывод

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Django ожидает, что вы передадите объект User, а не идентификатор, как вы это сделали, поэтому он выдает ошибку целостности.Например, если супервизор является текущим пользователем, он должен быть serializer.save(supervisor=request.user)

Ps: набрал это с моего телефона, надеюсь, я правильно разметил код.

0 голосов
/ 27 мая 2019

Я думаю, что ошибка в строке: supervisor = serializers.ReadOnlyField (source = 'supervisor.username') Вы пытались удалить его?

0 голосов
/ 27 мая 2019

попробуйте с:

   {
    "sitename" : "Tony Tower",
    "start_date" :"2019-5-5",
    "supervisor__id" : "1"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...