簡體   English   中英

Django通過一個表獲取數據,並使用過濾的相關對象集

[英]Django get data by one table with filtered set of related objects

我的目的是從OfferSite獲取基於網站的所有優惠,並在今天的日期使用OfferItem模型的過濾器。

當我在第二個模型上選擇所有沒有過濾器的所有時,我得到了所需的輸出(只有2個網站有offeritem_set),

In [23]: OfferSite.objects.all().select_related("offeritem")
Out[23]: [<OfferSite: OfferSite object>, <OfferSite: OfferSite object>]

但是當我嘗試過濾第二個模型時,我得到了很多對象,我認為它會為每個OfferItem返回OfferSite對象。 我期待只有兩個帶有offeritem_set OfferSite對象來獲取所有已過濾的OfferItem

``
In [24]: OfferSite.objects.all().select_related("offeritem").filter(offeritem__offer_date=tod)
Out[24]: [<OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, '...(remaining elements truncated)...']

是否有Django ORM方式獲得所需的輸出?

我的模特

class OfferSite(models.Model):
    name = models.CharField(max_length=30)
    domain_url = models.URLField()


class OfferItem(models.Model):
    title = models.CharField(max_length=255)
    link = models.CharField(max_length=750)
    image = ImageField()
    price_after_discount = models.CharField(max_length=100, blank=True, null=True)
    price_before_discount = models.CharField(max_length=100, blank=True, null=True)
    discount = models.CharField(max_length=100, blank=True, null=True)
    offer_date = models.DateField(auto_now_add=True, default=datetime.date.today())
    offer_from = models.DateTimeField(blank=True, null=True)
    offer_to = models.DateTimeField(blank=True, null=True)
    single_item = models.BooleanField(default=True)
    site = models.ForeignKey(OfferSite)
    archived = models.BooleanField(default=False)
    likes = models.IntegerField(max_length=4, default=0)
    unlikes = models.IntegerField(max_length=4, default=0)
    abusive = models.IntegerField(max_length=3, default=0)

以防其他人正在尋找解決方案。 這個問題的答案為什么django的prefetch_related()只適用於all()而不是filter()? 這個問題的標題沒有反映出這個問題,所以我錯過了。

我的解決方案是,

OfferSite.objects.all().prefetch_related(Prefetch("offeritem_set", queryset=OfferItem.objects.filter(offer_date=tod), to_attr="offers"))

這僅適用於Django 1.7及以上版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM