zelsky
@zelsky

Django дополнительный параметр при запросе (where)?

Практикой пытаюсь закрепить чтение документации.
Есть вьюха:
def alboms(request,cat_id):
	show_albums = Album.objects.all().filter(cat=cat_id)
	rando = Photo.objects.all().order_by('?')[: 1]
	categir = Categories.objects.all()
	context = {'albom': show_albums,'categor': categir,'thumb':rando}

	return render(request,'adst/albums.html',context)

Получаю рандомную фотку из таблицы с фото.
rando = Photo.objects.all().order_by('?')[: 1]
Надо добавить параметр where чтобы рандомная фотка получалась только из одного альбома а не с цело базы.

п.с Код моделей , вьюх , и темплейтов прилогаеться.
пп.сс В модели альбома есть поле с IntegerField куда я думал добавлять ид фотки для превью. Но что то както не срослось.
Модели
from django.db import models
from django_attach.models import Attachment
from django.contrib.contenttypes.generic import GenericRelation
from django import forms

# Create your models here.

class Categories(models.Model):
	id_cat = models.AutoField(primary_key=True)
	Name_cat = models.CharField(max_length=15)
	def __unicode__(self):
		return self.Name_cat


class Album(models.Model):
	cat = models.ForeignKey(Categories)
	id_alb = models.AutoField(primary_key=True)
	Name_album = models.CharField(max_length=100)
	Text_f_album = models.CharField(max_length=200)
	Title_page = models.CharField(max_length=70)
	Title_photo = models.CharField(max_length=60)
	Alt_photo = models.CharField(max_length=80)
	id_photo_for_thumb = models.IntegerField()
	desctiption = models.CharField(max_length=1100)
	def __unicode__(self):
		return '%s %s %s' % (self.Name_album, self.cat,self.id_photo_for_thumb)

class Photo(models.Model):
	alb = models.ForeignKey(Album)
	Title_f_photo = models.CharField(max_length=80)
	Alt_f_photo = models.CharField(max_length=80)
	image = models.ImageField(upload_to='media',default='_5q16cjpxm.jpg')
	def __unicode__(self):
		return self.Title_f_photo


Вьюхи
from django.shortcuts import render
from django.http import HttpResponse

from django.db import models
from adst.models import Album
from adst.models import Categories
from adst.models import Photo
# Create your views here.
def index(request):
	categir = Categories.objects.all()
	context = {'categor': categir}  
	return render(request,'adst/base.html',context)

def gallary(request,alb_id):
	get_photos = Photo.objects.all().filter(alb=alb_id)
	categir = Categories.objects.all()
	show_albums = Album.objects.all().filter(id_alb=alb_id)
	context = {'phot':get_photos,'categor': categir,'alb_opis':show_albums}
	return render(request,'adst/galar.html',context)

def alboms(request,cat_id):
	show_albums = Album.objects.all().filter(cat=cat_id)
	
	rando = Photo.objects.all().order_by('?')[: 1]
	categir = Categories.objects.all()
	context = {'albom': show_albums,'categor': categir,'thumb':rando}

	return render(request,'adst/albums.html',context)

Темплейт для отображения альбомов
{% extends "adst/base.html" %}
{% load static %} 
{% block meta_title %}{{ categor.Name_cat }}{% endblock meta_title %}
 {% block content %} 
<!-- Контент -->    
{% for albo in albom %}
        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">
          <div class="thumbnail with-caption">
           <a href="{% url "Watch" albo.id_alb %}"> {% for ran in thumb %}<img src="{{  ran.image.url }}" alt="My image"/> {% endfor%}</a>
            <center>
              {{ albo.Text_f_album }} {{rand.image.url }}
            </center>
          </div>
        </div> 
        {% endfor %}
        </div>
      </div>
    </div>
{% endblock content %}


URLS
from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.contrib.staticfiles import *
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    # Examples:
    url(r'^$', 'adst.views.index', name='home'),
    # url(r'^blast/', 'adst.views.testes', name='blast'),
    url(r'^watch/(?P<alb_id>\d+)$', 'adst.views.gallary', name='Watch'),
    # url(r'^albums/', 'adst.views.tisc', name='Alb'),
     url(r'^category/(?P<cat_id>\d+)$',  'adst.views.alboms', name='Albom'), 
    # url(r'^blog/', include('blog.urls')),
    url(r'^admin/', include(admin.site.urls)),
 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  • Вопрос задан
  • 383 просмотра
Пригласить эксперта
Ответы на вопрос 3
dizballanze
@dizballanze
Software developer at Yandex
Чтобы выбрать рандомную фотографию из альбомов которые входят в категорию с id = cat_id
def albums(request, cat_id):
  show_albums = Album.objects.all().filter(cat=cat_id)
  random = Photo.objects.filter(alb__cat_id=cat_id).order_by('?')[: 1]
  categir = Categories.objects.all()
  context = {'albom': show_albums,'categor': categir,'thumb':random}

  return render(request,' adst/albums.html',context)
Ответ написан
zelsky
@zelsky Автор вопроса
Спасибо. Но теперь не много в другом ошибка. Для одной категории оно берет рандомную фотку из алтбома из той же категории . Все ок если в категории один альбом, но если в категории три альбома то на всех 3-х будет одна и таже фотка.

Как можно получить параметр кроме как def albums(request, cat_id): отсюда,
Вот так нельзя ?

random = Photo.objects.filter(alb=show_albums.alb_id).order_by('?')[: 1]
Ответ написан
Комментировать
@some1else
Либо пробегаться циклом по всем альбомам, либо следующий трюк (работает не на всех db-бэкендах, точно работает в PostgreSQL):
Photo.objects.filter(alb__cat_id=cat_id).order_by('alb', '?').distinct('alb')

Получим в результате по одной случайной фотке на каждый альбом из категории
Однако не забывайте, что order_by '?' может быть веьма дорогой для БД операцией
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы