Найти - Пользователи
Полная версия: Не могу написать выборку и обработку объектов.
Начало » Django » Не могу написать выборку и обработку объектов.
1
SorrowFuck
Есть три модели связанных между собой:
class GoodsType(models.Model):
    name = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name
    class Meta:
        ordering = ('id',)
class SubGoodsType(models.Model):
    type = models.ForeignKey(GoodsType, unique=False)
    name = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name
    class Meta:
        ordering = ('type',)
class GoodsDescription(models.Model):
    subtype = models.ForeignKey(SubGoodsType, unique=False)
    basket = models.ManyToManyField(User, unique=False, null=True, blank=True)
    title = models.CharField(max_length=50, unique=False)
    articul = models.CharField(max_length=15, unique=False)
    image = models.ImageField(upload_to="description")
    description = models.TextField(max_length=4000)
    characteristics = models.TextField(max_length=4000, unique=False, null=True, blank=True)
    review = models.TextField(max_length=4000, unique=False, null=True, blank=True)
    number = models.IntegerField()
    price = models.CharField(max_length=15, unique=False, null=True, blank=True)

Так же есть функция представления:
def GoodsDescriptionCatalogPrint (request, self):
    subsubgoods = GoodsDescription.objects.filter(subtype=self)
    subgoods = SubGoodsType.objects.filter(id=self)
    goods = GoodsType.objects.get(id=subgoods.type)
    return render_to_response ("goods/catalog.html", {
        'subsubgoods': subsubgoods,
        'id_subgoods': self,
        'goods': goods,
    }, context_instance = RequestContext(request))

Задача получить список объектов GoodsDescription которые принадлежат к определенному SubGoodsType, получить 1 объект SubGoodsType, что бы выбрать из него name и type, а за тем получить один объект GoodsType, что бы выбрать его name.
Я не могу правильно составить запросы, потому, что SubGoodsType может содержать множество одинаковых GoodsType.id и get возвращает ошибку. А если оставляю представление как есть сейчас сервер выдает ошибку, потому как получает множество объектов насколько я понимаю: ‘QuerySet’ object has no attribute ‘type’.
Как исправить запросы?
FishHook
res=GoodsDescription.objects.filter(subtype=self)[0].subtype.type.name
SorrowFuck
FishHook
res=GoodsDescription.objects.filter(subtype=self)[0].subtype.type.name
Спасибо.
SorrowFuck
Переписал представление на такое:
def GoodsDescriptionCatalogPrint (request, self):
    subsubgoods = GoodsDescription.objects.filter(subtype=self)
    goods_name = SubGoodsType.objects.filter(id=self)[0].type
    goods = GoodsType.objects.get(name=goods_name)
    sub_goods_name = SubGoodsType.objects.filter(id=self)[0].name
    subgoods = SubGoodsType.objects.get(name=sub_goods_name)
    return render_to_response ("goods/catalog.html", {
        'subsubgoods': subsubgoods,
        'subgoods': subgoods,
        'goods': goods,
    }, context_instance = RequestContext(request))

Когда прописываю:
res = SubGoodsType.objects.filter(subtype=self)[0].subtype.type.name

Выдает строку содержимым которой является первый элемент после ограничителя, в данном случае subtype, возвращается юникод в одну строчку, соответственно без атрибутов.
В принципе код рабочий, но мне кажется, что тут через чур много запросов лишних, хотя и результат тот, что мне нужен, как-то это можно оптимизировать?
FishHook
SorrowFuck
но мне кажется, что тут через чур много запросов лишних
“Кажется” - это слово не из нашего репертуара.
Установите django-debug-toolbar и посмотрите сколько конкретно запросов получается.
SorrowFuck
FishHook
SorrowFuck
но мне кажется, что тут через чур много запросов лишних
“Кажется” - это слово не из нашего репертуара.
Установите django-debug-toolbar и посмотрите сколько конкретно запросов получается.

Получается 8 запросов на все уходит 15 мс, самый долгий по времени обработки запрос:
goods_name = SubGoodsType.objects.filter(id=self).type

Занимает 4.64 мс. В этой модели у меня записано 22 объекта сейчас.
FishHook
А одинаковые запросы присутствуют?
SorrowFuck
FishHook
А одинаковые запросы присутствуют?

Есть два запроса :
SELECT "goods_subgoodstype"."id", "goods_subgoodstype"."type_id", "goods_subgoodstype"."name" 
FROM "goods_subgoodstype" 
INNER JOIN "goods_goodstype" 
ON ("goods_subgoodstype"."type_id" = "goods_goodstype"."id") 
WHERE "goods_subgoodstype"."id" = 1 
ORDER BY "goods_subgoodstype"."type_id"
 ASC LIMIT 1
SELECT "goods_subgoodstype"."id", "goods_subgoodstype"."type_id", "goods_subgoodstype"."name" 
FROM "goods_subgoodstype" 
INNER JOIN "goods_goodstype" 
ON ("goods_subgoodstype"."type_id" = "goods_goodstype"."id") 
WHERE "goods_subgoodstype"."id" = 1 
ORDER BY "goods_subgoodstype"."type_id" 
ASC LIMIT 1

Соответственно с:
goods_name = SubGoodsType.objects.filter(id=self).type
sub_goods_name = SubGoodsType.objects.filter(id=self).name
FishHook
Мне б твои проблемы

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB