Django - 'Invalid pk - object does not exist' для отношения ManyToMany
По какой-то причине в if serializer.is_valid(raise_exception=True)
мой код жалуется на список hash_tags
, который должен быть первичными ключами класса HashTag
, что ключи в списке не действительны, но как вы можете видеть, у меня есть строка под views.py
, которая: hash_tags = [HashTag.objects.get_or_create(hash_tag=ht)[0].hash_tag for ht in hash_tags_list]
, которая должна генерировать допустимый список первичных ключей. Что происходит?
serializer.py
class Post(AbstractBaseModel):
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator")
join_goal = models.ForeignKey(JoinGoal, on_delete=models.CASCADE)
body = models.CharField(max_length=511, validators=[MinLengthValidator(5)])
hash_tags = models.ManyToManyField(HashTag)
type = models.CharField(
choices=PostType.choices,
max_length=50,
)
class HashTag(models.Model):
hash_tag = models.CharField(max_length=140, primary_key=True, validators=[
MinLengthValidator(1)])
# No update added, because cannot be edited. Can only be added and deleted
Serializer.py
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('creator', 'join_goal', 'body', 'uuid', 'created', 'type', 'updated_at', 'hash_tags')
view.py
@api_view(['POST'])
def post_create_update_post(request):
"""
POST endpoint for current user creating a goal update post
"""
user_uuid = str(request.user.uuid)
request.data['creator'] = user_uuid
request.data['type'] = PostType.UPDATE
post_text = request.data['body']
hash_tags_list = extract_hashtags(post_text)
hash_tags = [HashTag.objects.get_or_create(hash_tag=ht)[0].hash_tag for ht in hash_tags_list]
request.data['hash_tags'] = hash_tags
try:
with transaction.atomic():
serializer = PostSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
post_obj = serializer.save()
except Exception as e:
return Response(dict(error=str(e),
user_message=error_message_generic),
status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.data, status=status.HTTP_201_CREATED)
вот полная ошибка, которая выходит из e
в except Exception as e
ValidationError({'hash_tags': [ErrorDetail(string='Invalid pk "['Test']" - объект не существует.', code='does_not_exist')]})
странная вещь, если я делаю это в консоли
HashTag.objects.get(pk='Test')
<HashTag: HashTag object (Test)>
мы ясно видим, что существует объект HashTag с pk='Test'. Моя теория заключается в том, что я передаю список первичных ключей. Хотя я предполагал, что это должно быть нормально для отношения ManyToMany.
Если вы внимательно прочитаете ошибку, вы увидите, что данные, которые вы передаете "['Test']"
, поэтому модель пытается найти hash_tag = "['Test']", которого нет в вашей базе данных, и поэтому вы получаете приведенную выше ошибку.
Вот как исправить эту проблему :-
post_obj = serializer.save()
for ht in hash_tags_list:
hash_tag = HashTag.objects.get_or_create(hash_tag=ht)
post_obj.hash_tags.add(hash_tag)