Python Django. Устранить ошибку и улучшить код

Выполнен
Заказ
5881557
Раздел
Программирование
Предмет
Тип работы
Антиплагиат
Не указан
Срок сдачи
18 Фев в 21:55
Цена
Договорная
Блокировка
5 дней
Размещен
14 Фев в 00:54
Просмотров
84
Описание работы

В архиве пет-проект Django c инструкцией по установке (README.md). Есть необходимость его немного доработать, а именно:

  1. При запуске проекта и открытии его в браузере сразу возникла ошибка 

AttributeError: 'NoneType' object has no attribute 'strftime'

Она появится в терминале (я использую pycharm). Видимо в каких-то инстансах даты нет. Если прописать условие, то она пропадает, но появляется новая

django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

Это корзина для анонимных пользователей, здесь следует использовать сессии джанго.

Прошу внести коррективы в коде, чтобы устранить ошибку и выделить изменения с комментариями.


  1. Касательно первой ошибки, я заметил, что полностью переписываете выходные данные сериализатора, во многом по сути дублируя логику, которая уже есть. И почему не использовать related_name? Вот пример того, как это можно сделать в рамках drf:

models.py

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


serializers.py

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%
Время выполнения заказа:
2 дня 17 часов 34 минуты
Выполнен в срок
Нужна аналогичная работа?
Оформи быстрый заказ и узнай стоимость
Гарантированные бесплатные доработки
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Темы журнала
Показать ещё
Прямой эфир