Как использовать Django API с Foreignkey - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь сохранить внешний ключ в сериализаторе restframework django.

Моя цель - сохранить в базе данных информацию с iframely.com, и эта часть работает хорошо.Но мне нужно также сохранить его в определенной категории.После добавления поля "Board (поле названия моей категории)" у меня ошибка: нулевое значение в столбце "board_id" нарушает ненулевое ограничение

Моя модель:

class Embed(models.Model):
    url = models.URLField(max_length=255)
    title = models.CharField(max_length=255)
    description = models.TextField()
    thumbnail_url = models.URLField(max_length=255)
    html = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    board = models.ForeignKey(Board, on_delete=models.CASCADE, verbose_name='Kategoria')

Форма:

class SubmitEmbed(forms.Form):
    url = forms.URLField()
    board = forms.ModelChoiceField(queryset=Board.objects.all())

Сериализатор:

class EmbedSerializer(serializers.ModelSerializer):
    author = serializers.HiddenField(default=serializers.CurrentUserDefault())
    board = serializers.RelatedField(read_only=True)

    class Meta:
        model = Embed
        fields = '__all__'

Вид:

def save_embed(request):

    if request.method == "POST":
        form = SubmitEmbed(request.POST)
        if form.is_valid():
            url = form.cleaned_data['url']
            r = requests.get('http://iframe.ly/api/oembed?url=' + url + '&key=' + settings.IFRAMELY_KEY)
            json = r.json()
            serializer = EmbedSerializer(data=json, context={'request': request})
            if serializer.is_valid():
                embed = serializer.save()
                return render(request, 'embed/embeds.html', {'embed': embed})
    else:
        form = SubmitEmbed()

    return render(request, 'embed/embedadd.html', {'form': form})

1 Ответ

0 голосов
/ 07 марта 2019

Это потому что у вас есть

class EmbedSerializer(serializers.ModelSerializer):
    author = serializers.HiddenField(default=serializers.CurrentUserDefault())
    board = serializers.RelatedField(read_only=True)

Вы установили доску на read_only.DRF пропустит это поле, если оно будет предоставлено и произойдет проверка DRF.

Вы можете удалить всю строку, и она будет работать.

...