MU
7 марта 2019 г. 16:01

Django rest framework and foreignkey

django, Django, python

Hi,

I try to save foreign key in django restframework serializer.

My goal is to save in database information from iframely.com and this part works good. But I need to also save it in specific category. After add field "Board(my category name field)" I have error: null value in column "board_id" violates not-null constraint

Maybe here someone help me.

My model:

  1. class Embed(models.Model):
  2. url = models.URLField(max_length=255)
  3. title = models.CharField(max_length=255)
  4. description = models.TextField()
  5. thumbnail_url = models.URLField(max_length=255)
  6. html = models.TextField()
  7. author = models.ForeignKey(User, on_delete=models.CASCADE)
  8. board = models.ForeignKey(Board, on_delete=models.CASCADE, verbose_name='Kategoria')

Form:

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

Serializer:

  1. class EmbedSerializer(serializers.ModelSerializer):
  2. author = serializers.HiddenField(default=serializers.CurrentUserDefault())
  3. board = serializers.RelatedField(read_only=True)
  4.  
  5. class Meta:
  6. model = Embed
  7. fields = '__all__'

View:

  1. def save_embed(request):
  2.  
  3. if request.method == "POST":
  4. form = SubmitEmbed(request.POST)
  5. if form.is_valid():
  6. url = form.cleaned_data['url']
  7. r = requests.get('http://iframe.ly/api/oembed?url=' + url + '&key=' + settings.IFRAMELY_KEY)
  8. json = r.json()
  9. serializer = EmbedSerializer(data=json, context={'request': request})
  10. if serializer.is_valid():
  11. embed = serializer.save()
  12. return render(request, 'embed/embeds.html', {'embed': embed})
  13. else:
  14. form = SubmitEmbed()
  15.  
  16. return render(request, 'embed/embedadd.html', {'form': form})
2

Вам это нравится? Поделитесь в социальных сетях!

1
Evgenii Legotckoi
  • 7 марта 2019 г. 16:20

Hi,

You need to add default value, or set up this field like null=True, and blank=True

  1. board = models.ForeignKey(Board, on_delete=models.CASCADE, verbose_name='Kategoria', null=True)

or

  1. board = models.ForeignKey(Board, on_delete=models.CASCADE, verbose_name='Kategoria', null=True, blank=True)

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь