Найти - Пользователи
Полная версия: Помогите составить запрос.
Начало » Django » Помогите составить запрос.
1 2
wizard
Здравствуйте.
Есть модели

class SpiderCharacteristicType(models.Model):
    name = models.CharField(_(u'Name'), max_length=255)
class SpiderCharacteristic(models.Model):
    characteristic_type = models.ForeignKey(SpiderCharacteristicType)
    value = models.CharField(_(u'Value'), max_length=255)
    item = models.ForeignKey(SpiderItem)
    
class SpiderItem(models.Model):
    article = models.CharField(_(u'Артикул'), max_length=255, help_text=u'')
    name = models.CharField(_(u'Наименование'), max_length=255, help_text=u'')
   

как мне сформировать запрос чтобы проверить наличие записи?

Делаю так, но что то не работает

mydict = {'article__exact': self.article,
          'vendor_id__exact': self.vendor_id,
            }
            
self.features = {}
if item[u'Цвет'] != '':
   self.features['color'] = item[u'Цвет']
if item[u'Размер'] != '':
   self.features['size'] = item[u'Размер']
mydict['spidercharacteristic__value'] = self.features.values()
try:
   self.obj = SpiderItem.objects.get(**mydict)
except ObjectDoesNotExist:    
   print 'error'

Тоесть если проверять одни значения, то он не находит уже созданный товар и заново его создает.
нужно как то проверять (characteristic_type='size', value=2), (characteristic_type='color', value=2)

P.S.
Если поменять
mydict['spidercharacteristic__value'] = self.features.values()
на
for self.dict_key, self.dict_value in self.features.items():
   mydict['spidercharacteristic__characteristic_type']=SpiderCharacteristicType.objects.get(name=self.dict_key)
   mydict['spidercharacteristic__value'] = self.dict_value
То направление как мне кажется верное, но в запрос попадает естественно только крайний ключ.
FishHook
нихрена не понял
wizard
Как мне правильно составить запрос вида :
SpiderItem.objects.get(article__exact = self.article, vendor_id__exact =self.vendor_id, (spidercharacteristic__characteristic_type='color', spidercharacteristic__value='red'), (spidercharacteristic__characteristic_type='size', spidercharacteristic__value='s'))
ilnur
тебе кажись нужна фильтрация. Используй фильтр и фильтр Q
SpiderItem.objects.filter(
  article__exact = self.article, 
  vendor_id__exact =self.vendor_id, 
  Q(spidercharacteristic__characteristic_type='color', 
  spidercharacteristic__value='red') | 
  Q(spidercharacteristic__characteristic_type='size', 
  spidercharacteristic__value='s'))
Sergei
SpiderItem - модель с двумя полями (ок, есть один FK на SpiderItem), а что такое
>SpiderItem.objects.get(хренова-туча-чего-то) автор и сам не вполне понимает

Не добавляйте никаких непонятных вам кусочков кода, это все лишнее:
for self.dict_key, self.dict_value in self.features.items():
Для чего тут self ? На квант времени подержать значение? Но это лирика.

Начните снова. Модели ваши видны, вопрос
wizard
как мне сформировать запрос чтобы проверить наличие записи?
к какой таблице/модели относился?
Три таблицы, в какой из них вы хотите проверить наличие записи?
Каковы критерии этой проверки? Забудьте пока про код, вы нехорошо на нем пока изъясняетесь, на пальцах, словами расскажите.
wizard
ilnur
тебе кажись нужна фильтрация. Используй фильтр и фильтр Q
Только мне нужно не OR а AND, а такой запрос с ошибкой выпадает

SpiderItem.objects.get(article='7261', Q(spidercharacteristic__characteristic_type=SpiderCharacteristicType.objects.get(name='size'),
  spidercharacteristic__value='S') , Q(spidercharacteristic__characteristic_type=SpiderCharacteristicType.objects.get(name='color'), 
  spidercharacteristic__value=u'сиреневый'))
...         
  File "<console>", line 1
SyntaxError: non-keyword arg after keyword arg
wizard
>>> SpiderCharacteristic.objects.filter(item=SpiderItem.objects.get(article='14773'))
[<SpiderCharacteristic: color - сиреневый>, <SpiderCharacteristic: size - S>]
>>> SpiderItem.objects.filter(Q(spidercharacteristic__characteristic_type=SpiderCharacteristicType.objects.get(name='size'), spidercharacteristic__value='S') & Q(spidercharacteristic__characteristic_type=SpiderCharacteristicType.objects.get(name='color'), spidercharacteristic__value=u'сиреневый'))
...         
[]
ilnur
SpiderItem.objects.filter(
  article__exact = self.article, 
  vendor_id__exact =self.vendor_id, 
  Q(spidercharacteristic__characteristic_type='color', 
  spidercharacteristic__value='red') &
  Q(spidercharacteristic__characteristic_type='size', 
  spidercharacteristic__value='s'))
get возвращает 1 объект.
А у тебя как я понял может быть больше. Поэтому используй filter.
ilnur
что возвращает МОЙ запрос?
ilnur
т.к. SpiderCharacteristic имеет поле ссылку на объект SpiderItem, то из SpiderItem vожно добраться и до полей SpiderCharacteristic. обратной связью
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