Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Не могу написать выборку и обработку объектов. [RSS Feed]

#1 Окт. 17, 2012 14:09:34

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

Есть три модели связанных между собой:

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’.
Как исправить запросы?



_________
Новичок

Отредактировано SorrowFuck (Окт. 17, 2012 14:33:22)

Офлайн

#2 Окт. 17, 2012 14:27:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

res=GoodsDescription.objects.filter(subtype=self)[0].subtype.type.name



Офлайн

#3 Окт. 17, 2012 14:34:31

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

FishHook
res=GoodsDescription.objects.filter(subtype=self)[0].subtype.type.name
Спасибо.



_________
Новичок

Офлайн

#4 Окт. 17, 2012 16:11:32

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

Переписал представление на такое:

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, возвращается юникод в одну строчку, соответственно без атрибутов.
В принципе код рабочий, но мне кажется, что тут через чур много запросов лишних, хотя и результат тот, что мне нужен, как-то это можно оптимизировать?



_________
Новичок

Офлайн

#5 Окт. 18, 2012 05:35:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

SorrowFuck
но мне кажется, что тут через чур много запросов лишних
“Кажется” - это слово не из нашего репертуара.
Установите django-debug-toolbar и посмотрите сколько конкретно запросов получается.



Офлайн

#6 Окт. 18, 2012 09:16:29

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

FishHook
SorrowFuck
но мне кажется, что тут через чур много запросов лишних
“Кажется” - это слово не из нашего репертуара.
Установите django-debug-toolbar и посмотрите сколько конкретно запросов получается.

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

Занимает 4.64 мс. В этой модели у меня записано 22 объекта сейчас.



_________
Новичок

Офлайн

#7 Окт. 18, 2012 09:23:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

А одинаковые запросы присутствуют?



Офлайн

#8 Окт. 18, 2012 10:18:24

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

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



_________
Новичок

Офлайн

#9 Окт. 18, 2012 11:12:02

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не могу написать выборку и обработку объектов.

Мне б твои проблемы



Офлайн

  • Начало
  • » Django
  • » Не могу написать выборку и обработку объектов.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version