В архиве пет-проект Django c инструкцией по установке (README.md). Есть необходимость его немного доработать, а именно:
AttributeError: 'NoneType' object has no attribute 'strftime'
Она появится в терминале (я использую pycharm). Видимо в каких-то инстансах даты нет. Если прописать условие, то она пропадает, но появляется новая
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
Это корзина для анонимных пользователей, здесь следует использовать сессии джанго.
Прошу внести коррективы в коде, чтобы устранить ошибку и выделить изменения с комментариями.
class Product(models.Model):
class Meta:
ordering = ['title', 'price']
verbose_name = "Продукт"
verbose_name_plural = "Продукты"
category = models.ForeignKey(Category, on_delete=models.CASCADE)
subcategory = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
price = models.DecimalField(default=0, max_digits=8, decimal_places=2)
count = models.IntegerField(default=0)
date = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
title = models.CharField(max_length=200, verbose_name="Название продукта")
description = models.TextField(null=False, blank=True)
specification = models.ManyToManyField(
"Specification", verbose_name="Характеристика", related_name="products"
)
freeDelivery = models.BooleanField(default=True)
tags = models.ManyToManyField(Tag, verbose_name="Тег", related_name="tags")
rating = models.DecimalField(
max_digits=3,
decimal_places=2,
default=0.00,
validators=[MinValueValidator(0), MaxValueValidator(5)],
)
count_of_orders = models.IntegerField(default=0)
@property
def get_rating(self):
"""Метод получения рейтинга продукта по количеству отзывов и их оценок"""
reviews = self.reviews.values_list("rate", flat=True)
if reviews.count() == 0:
rating = 0
return rating
rating = sum(reviews) / reviews.count()
return rating
def __str__(self):
return self.title
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ("id", "name")
class ImageSerializer(serializers.ModelSerializer):
src = serializers.CharField(source="image.url")
alt = serializers.CharField(source="image.name")
class Meta:
model = ProductImage
fields = ("src", "alt")
class ProductSerializer(serializers.ModelSerializer):
tags = TagSerializer(many=True)
images = ImageSerializer(many=True)
reviews = serializers.SerializerMethodField()
category = serializers.IntegerField(source="category_id")
rating = serializers.FloatField(source="get_rating")
class Meta:
model = Product
fields = ("id", "title", "price", "images", "tags", "reviews", "rating", "id", "category", "count", "date", "description", "freeDelivery")
def get_reviews(self, obj: Product) -> int:
return obj.reviews.count()
Если удалить из модели Product поле rating,то можно переименовать get_rating в rating, а из сериализатора убрать строку
rating = serializers.FloatField(source="get_rating")
Здесь используется фреймворк, и очень многое уже есть из их коробки, потому важно использовать документацию. Собственно, похожая история и в других сериализаторах.
Прошу улучшить код всех возможных сериализаторах в проекте, используя вышеупомянутую подсказку. изменения в коде выделить и прокомментировать.
Прошу адекватно оценить данную задачу. По срокам выполнения договоримся. Есть вопросы - пишите!
Гарантия на работу | 1 год |
Средний балл | 4.96 |
Стоимость | Назначаете сами |
Эксперт | Выбираете сами |
Уникальность работы | от 70% |