2017-02-20 23 views
0

Привет всем иметь структуру объектовАнализировать QuerySet в шаблонах

userfavs = UserFavs.objects.filter(
     user_id=self.request.user.id) 
  • userfavs
    • блюдо (ID = 3)
      • магазин (ID = 1)
    • блюдо (id = 30)
      • магазин (ID = 2)
    • тарелки (ID = 5)
      • магазин (ID = 1)
    • тарелки (ID = 15)
      • (id = 2)

в шаблоне я должен иметь

  • магазин (1) - магазин (2)
    • тарелки (3) - блюдо (15)
    • тарелки (5) - блюдо (30)

Я не могу понять, как я должен перестроиться запрос набор для отдавания урожденная результат? Может у меня помочь?

class UserFavs(models.Model): 
    user = models.ForeignKey(RegModel, verbose_name=u'Пользователь', 
          related_name="userreg", null=True) 
    dish = models.ForeignKey(Dish, verbose_name=u'Блюдо', 
          related_name="favsdish", null=True) 


class Dish(models.Model): 

criterion_list = (
    ('1', u'Блюдо без мяса'), 
    ('2', u'Острое блюдо'), 
    ('3', u'Здоровое питание'), 
    ('4', u'Акция'), 
    ('5', u'Блюдо сезона'), 
    ('6', u'Блюдо дня'), 
    ('7', u'Ваше любимое блюдо'), 
    ('8', u'Еда за баллы')) 

name = models.CharField(max_length=255, verbose_name=u'Название') 
criterion_first = models.CharField(max_length=255, blank=True, 
            null=True, 
            choices=criterion_list, 
            verbose_name=u'Критерий 1') 

criterion_second = models.CharField(max_length=255, blank=True, 
            null=True, 
            choices=criterion_list, 
            verbose_name=u'Критерий 2') 

price = models.FloatField(max_length=255, verbose_name=u'Цена', 
          default=0, blank=True, null=True) 
weight = models.CharField(max_length=255, verbose_name=u'Вес', 
          blank=True, null=True) 
description = models.TextField(max_length=3000, 
           verbose_name=u'Описание', 
           blank=True, null=True) 
points_price = models.IntegerField(verbose_name=u'Цена за баллы', 
            default=0, blank=True, null=True) 
is_points = models.BooleanField(verbose_name=u'Еда за баллы', 
           default=False, blank=True) 
is_recom = models.BooleanField(verbose_name=u'В рекомендациях?', 
           default=True, blank=True) 
sale = models.IntegerField(verbose_name=u'Скидка', 
          blank=True, null=True) 
is_active = models.BooleanField(verbose_name=u'Блюдо активно?', 
           default=True, blank=True) 
shop = models.ForeignKey(Shop, verbose_name=u'Заведение', 
         related_name="dishshop") 

def __unicode__(self): 
    return u'%s' % (self.name) 


class Shop(models.Model): 
name = models.CharField(max_length=255, verbose_name=u'Название') 
time_begin = models.TimeField(max_length=255, 
           verbose_name=u'Время начала работы') 
time_end = models.TimeField(max_length=255, 
          verbose_name=u'Время окончания работы') 
phone = models.CharField(max_length=255, verbose_name=u'Телефон') 
preview = models.FileField(upload_to='files/shop/preview') 
delivery_price = models.IntegerField(verbose_name=u'Стоимость доставки') 
min_order = models.IntegerField(verbose_name=u'Минимальный заказ') 
del_wait_time = models.IntegerField(verbose_name=u'Время доставки минут') 
is_always = models.BooleanField(verbose_name=u'Круглосуточно?', 
           default=True, blank=True) 
is_cash = models.BooleanField(verbose_name=u'Наличными', 
           default=True, blank=True) 
is_card = models.BooleanField(verbose_name=u'Картой курьеру', 
           default=True, blank=True) 
is_online = models.BooleanField(verbose_name=u'Онлайн-оплата', 
           default=True, blank=True) 
is_points = models.BooleanField(verbose_name=u'Еда за баллы', 
           default=True, blank=True) 
notification = models.CharField(max_length=255, 
           verbose_name=u'Важное уведомление', 
           blank=True, null=True) 
email = models.CharField(max_length=255, verbose_name=u'E-mail') 
rate = models.FloatField(max_length=255, verbose_name=u'Рейтинг') 
destination = models.CharField(max_length=255, 
           verbose_name=u'Местоположение') 
specific = models.CharField(max_length=255, 
          verbose_name=u'Специализация ресторана') 
description = models.TextField(max_length=3000, 
           verbose_name=u'Описание') 
cook = models.CharField(max_length=255, verbose_name=u'Имя повара') 
image_cook = models.FileField(upload_to='files/shop/cook') 
desc_cook = models.TextField(max_length=3000, 
          verbose_name=u'Описание повара') 
shoptype = models.ForeignKey(ShopType, verbose_name=u'Тип заведения', 
          related_name="shop") 
slider = models.ForeignKey(Slider, verbose_name=u'Слайдер', 
          related_name="slider") 
def __unicode__(self): 
    return u'%s' % (self.name) 
+0

Можете ли вы показать свою модель UserFavs? – mxle

+0

yeap. сделанный? я вижу это в вопросе –

+0

Да, спасибо, я вижу. Я не могу понять, почему вы делаете блюдо (3) - блюдо (15), а не блюдо (3) - блюдо (30). Почему вы группируете их так? У них есть одно и то же название? – mxle

ответ

1

Чтобы сгруппировать в магазин, вы можете использовать django group on other properties. В вашем случае это будет:

{% regroup userfavs by dish.shop as user_favourites %} 
{% for item in user_favourites %} 
    <span class="one_col"> 
     {{ item.grouper }} ({{ item.grouper.id }}) {% if not forloop.last %} - {% endif %} 
    </span> 
{% endfor %} 
{% for item in user_favourites %} 
    <span class="one_col"> 
     {% for userfav in item.list %} 
      {{ userfav.dish }} ({{ userfav.dish.id }}) {% if not forloop.last %} - {% endif %} 
     {% endfor %} 
    </span> 
{% endfor %} 

Вам нужно будет установить правило CSS для класса «one_col», чтобы удовлетворить ваши требования к конструкции, которые не являются частью вопроса.