Django - Установка атрибута ManyToMany с пустым списком и сериализация
Ниже приведен код, который устанавливает отношения tagged_users
и hash_tags
в Post
. Он принимает тело Post
и анализирует его на наличие хэштегов (любое слово, начинающееся с #) или tagged_user
(любое слово, начинающееся с @). Иногда сообщение не содержит ни того, ни другого, что вызывает ошибку в этой строке request.data['tagged_users'] = tagged_users
. Как решить эту проблему, чтобы можно было смириться с тем, что он выдает пустой список?
Ошибка, которую я получаю:
ValidationError({'tagged_users': [ErrorDetail(string='“[]” is not a valid UUID.', code='invalid')]})
view.py
def request_to_post_data(request):
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
tagged_users_list = extract_usernames(post_text)
tagged_users = list()
for username in tagged_users_list:
try:
tagged_users.append(User.objects.get(username=username).uuid)
except User.DoesNotExist:
pass
request.data['tagged_users'] = tagged_users
serializer = PostSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
post_obj = serializer.save()
create_image_models_with_post(request=request, post_obj=post_obj)
create_video_models_with_post(request=request, post_obj=post_obj)
return serializer
serializer.py
class PostSerializer(serializers.ModelSerializer):
hash_tags = HashTagSerializer(many=True, read_only=True)
class Meta:
model = Post
fields = ('creator', 'body', 'uuid', 'created', 'type', 'updated_at', 'hash_tags', 'tagged_users')
models.py
class Post(models.Model):
# ulid does ordered uuid creation
uuid = models.UUIDField(primary_key=True, default=generate_ulid_as_uuid, editable=False)
created = models.DateTimeField('Created at', auto_now_add=True)
updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator")
body = models.CharField(max_length=POST_MAX_LEN, validators=[MinLengthValidator(POST_MIN_LEN)])
hash_tags = models.ManyToManyField(HashTag)
tagged_users = models.ManyToManyField(User)
Необходимо установить blank=True
на ManyToManyField
тогда не добавлять в запрос, если такового не существует.
views.py
def request_to_post_data(request):
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]
if len(hash_tags) > 0:
request.data['hash_tags'] = hash_tags
tagged_users_list = extract_usernames(post_text)
tagged_users = list()
for username in tagged_users_list:
try:
tagged_users.append(User.objects.get(username=username).uuid)
except User.DoesNotExist:
pass
if len(tagged_users) > 0:
request.data['tagged_users'] = tagged_users
serializer = PostSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
post_obj = serializer.save()
create_image_models_with_post(request=request, post_obj=post_obj)
create_video_models_with_post(request=request, post_obj=post_obj)
return serializer
models.py
class Post(models.Model):
# ulid does ordered uuid creation
uuid = models.UUIDField(primary_key=True, default=generate_ulid_as_uuid, editable=False)
created = models.DateTimeField('Created at', auto_now_add=True)
updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator")
body = models.CharField(max_length=POST_MAX_LEN, validators=[MinLengthValidator(POST_MIN_LEN)])
hash_tags = models.ManyToManyField(HashTag, blank=True)
tagged_users = models.ManyToManyField(User, blank=True)