Django e-commerce part28 Distinct & Random Queryset
重複なしの、ランダムなqueryset
今のままだと、重複する可能性がある。
class ProductDetailView(DetailView)の修正
order_by を外して、sorted と、lambda を使って見る。
context["related"] = sorted(Product.objects.get_related(instance)[:6], key=lambda x: x.title)
sortedに関しては、公式ドキュメントを参照。
簡単に言うと、sortedは、keyを指定することで、順番を指定することができる。
lambda は、無名関数のことらしい。詳しくはこちらのサイトを参照。
defで定義しない関数のこと?
なので、上記の例で言うと、以下のように置き換えが可能になる。
key=lambda x: x.title # 以下と同義 def key(x): return x.title
さらに、sortedは、reverseの指定ができる。
context["related"] = sorted(Product.objects.get_related(instance)[:6], key=lambda x: x.id, reverse=True)
ramdom をimportして使って見る
さらにramdom をimportして使って見る
import random class ProductDetailView(DetailView): ... context["related"] = sorted(Product.objects.get_related(instance)[:6], key=lambda x: random.random()) return context
models.py にget_image_url functionを定義する。
class Product(models.Model): ... def get_image_url(self): img = self.productimage_set.first() if img: return img.image.url return img
product_detail.html にget_image_urlを反映させる。
反映させる箇所は2箇所 * detail viewのメインページの箇所 * related productsの箇所
{% block content %} <div class='row'> <div class='col-sm-8'> <h2>{{ object.title }}</h2> {% if object.get_image_url %} <img id='img' class='img-responsive' src='{{ object.get_image_url }}' /> {% endif %} <p class='lead'>{{ object.description }}</p> </div> ... <h4>Realated Products</h4> {% for product in related %} {% if product.get_image_url %} <img id='img' class='img-responsive' src='{{ product.get_image_url }}' /></a></br> {% else %} <a href='{{ product.get_absolute_url }}'>{{ product.title }}</a></br> {% endif %} {% endfor %}
不明点など
context["related"] = sorted(Product.objects.get_related(instance)[:6], key=lambda x: x.id, reverse=True)
import random class ProductDetailView(DetailView): ... context["related"] = sorted(Product.objects.get_related(instance)[:6], key=lambda x: random.random()) return context
で、sortedの場合のkeyの動作。なぜxで、行けるのか?
- なぜget_image_urlは、product managerに定義しないのか?