読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

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に定義しないのか?