我正在嘗試將帖子添加到列表視圖,主頁列表視圖已經有一個項目上下文。在我的項目中,用戶可以添加帖子和添加項目,每個都是具有不同模型的不同應用程序。所以在我的主頁列表視圖中,我循環顯示了我的項目,并且在每個項目中,它都顯示了與之相關的用戶。我想做的是檢查此 item.user 是否有admin_approved=True與用戶相關的帖子,如果確實存在,則頁面中會顯示一個按鈕顯示,鏈接到包含這些帖子的另一個頁面。因此,如果有零個與用戶相關的帖子或可用的帖子,但 admin_approved=False按鈕不應 admin_approved=True出現,但如果有 1 個或多個帖子,則admin_approved=True按鈕應該出現。我試圖注釋查詢集,但問題是當用戶有 2 個帖子時,一個已獲批準,另一個未獲批準,2 個項目出現一個帶有按鈕,一個沒有按鈕,并且在主頁列表視圖中發生重復我曾嘗試使用 .distinct() 但它沒有用,項目仍然重復這是模型.pyclass Post(models.Model): designer = models.ForeignKey(User, on_delete=models.CASCADE) title = models.CharField(max_length=100, unique=True) admin_approved = models.BooleanField(default=False)這是意見from .models import Itemfrom django.db.models import Case, When, BooleanField, Qclass HomeView(ListView): model = Item paginate_by = 12 template_name = "home.html" ordering = ['-timestamp'] def get_queryset(self): has_post = Case( When(Q(designer__post__isnull=False) & Q(designer__post__admin_approved=True), then=True), default=False, output_field=BooleanField() ) return super().get_queryset().annotate(has_post=has_post).distinct()這是模板{% for item in object_list %} {{ item.title }} {% if item.has_post %} SHOW BUTTON {% else %} HIDE BUTTON {% endif %}{% endfor %}這是項目模型class Item(models.Model): designer = models.ForeignKey( User, on_delete=models.CASCADE) title = models.CharField(max_length=100)
1 回答

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
Item
它會為每個組合重復每個designer__post
,因為您不使用“折疊”功能。
您可以改用子Exists
查詢 [Django-doc]:
from django.db.models import Exists, OuterRef
class HomeView(ListView):
model = Item
paginate_by = 12
template_name = "home.html"
ordering = ['-timestamp']
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).annotate(
has_post=Exists(
Post.objects.filter(
designer_id=OuterRef('designer_id'),
admin_approved=True
)
)
)
添加回答
舉報
0/150
提交
取消