Django — Установите множество атрибутов с пустым списком и сериализуйте

#python #django

Вопрос:

У меня есть этот код ниже, который устанавливает отношения tagged_users и hash_tags в a 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)  

Комментарии:

1. Не могли бы вы предоставить мне ссылку на Github этого проекта?

2. @TariqAhmed это личное, к сожалению

3. Я хочу изучить все эти навыки, которые вы используете в своем проекте.. Какой-нибудь другой источник?

4. @TariqAhmed Я не уверен, о каких «навыках» вы говорите?

Ответ №1:

Необходимо установить 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) gt; 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) gt; 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)