0

要点:
モデル:

class Shop(models.Model):
    name = models.CharField(max_length=255)        

class Product(models.Model):
    name = models.CharField(max_length=255)
    shops = models.ManyToManyField(Shop, through='ProductShop', related_name='products')

class ProductShop(models.Model):
    product = models.ForeignKey(Product)
    shop = models.ForeignKey(Shop)
    price = models.DecimalField(max_digits=20, decimal_places=2)

ここで、この商品を販売しているすべてのショップで利用可能な最低価格で注文された商品のリストを取得したいと思います。私はいつもannotateそのようなクエリに使用しましたが、ここでは解決策を考えることができません。これが私が手に入れたいおおよそのものです:

products = Product.objects.annotate(price=SOMETHING_TO_GET_THE_LOWEST_PRICE_PER_PRODUCT).order_by('price')

そのための良い解決策はありますか?私は知ってextraいますが、プレーンSQLを書きたくありません。私は答えを見つけるために最善を尽くしましたが、私の特定の問題をグーグルで検索することはできませんでした。

ありがとう!

4

2 に答える 2

1

もしかして:

products = ProductShop.objects.filter(
   shop__in=Shop.objects.filter()).annotate(Min(price)).order_by('price')

{% for ps in productshop %}
    Shop: {{ ps.product.shop }}
    Product: {{ ps.product }}
    Minimum Price: {{ ps.price }}
{% endfor %}
于 2013-03-10T11:47:45.347 に答える
0

最後に、わずかな回避策でそれを解決しました:

class Product(models.Model):
    name = models.CharField(max_length=255)
    shops = models.ManyToManyField(Shop, through='ProductShop', related_name='products')
    def lowest_possible_price(self):
        shops = self.shops.all()
        if not shops:
            return "N/A"
        return reduce(lambda x, y: min(x, ProductShop.objects.get(shop__pk=y.id, product__pk=self.id).price), 
                shops, ProductShop.objects.get(shop__pk=shops[0].id, product__pk=self.id).price)


products = sorted(Product.objects.all(),
        key = lambda product : product.lowest_possible_price())

ヘルパー関数のない1行のソリューションがある場合はまだ気になります(lowest_possible_priceここ)

于 2013-05-06T08:30:55.770 に答える