#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)