[英]How can I filter a Django-Model with 2 foreign keys?
我有以下型號:
class Event(models.Model):
event = models.ForeignKey(EventType)
name = models.CharField(max_length=128, null=True, blank=True)
class Order(models.Model):
requester = models.CharField(max_length=128)
email = models. EmailField()
phone = models.CharField(max_length=13)
payment_date = models.DateTimeField()
added = models.DateTimeField(auto_now_add=True)
viewed = models.BooleanField(default=False)
password = models.CharField(max_length=6,blank=True,null=True)
class Picture(models.Model):
event = models.ForeignKey(Event)
image = models.ImageField(upload_to='media')
show_name = models.CharField(max_length=128, blank=True, null= True)
file_name = models.CharField(max_length=128, blank=True, null=True)
class OrderItem(models.Model):
order = models.ForeignKey(Order)
picture = models.ForeignKey(Picture)
amount = models.PositiveSmallIntegerField()
我正在嘗試計算屬於每個事件的所有訂單。 有時,在很多事件中都有訂單,這就是為什么我不能在Order和Event之間使用FK的原因。
我嘗試獲取所有“ OrderItem”,然后轉到“圖片”,然后轉到“事件”,因此,如果訂單中的圖片屬於某個事件,則計數器將計數一次。 但這就是我被困住的地方。
這是我的view.py的一部分:
active_events = Event.objects.filter(is_active=True)
pictures_detail = OrderItem.objects.all()
picture = Picture.objects.all()
print_order = PrintOrder.objects.all()
context_dict['print_order'] = {}
for event in active_events:
print_order_counter = 0
for detail in pictures_detail:
for pic in picture:
for order in print_order:
print_order_counter += 1
for orders in pictures_detail:
context_dict['print_order'].update(
{event.id : print_order_counter})
任何幫助,將不勝感激。
先感謝您。
如果沒有詳細說明,似乎您正在使用復雜的方案。 通過在模型的字段定義中使用related_name
關鍵字參數,可以查找所有與反向相關的外鍵對象。 可以為每個外鍵設置,並由父模型調用。
class OrderItem(models.Model):
order = models.ForeignKey(Order)
picture = models.ForeignKey(Picture,related_name='order_items')
amount = models.PositiveSmallIntegerField()
for pic in Picture.objects.all():
print(pic.order_items.all())
>>> [queryset of all order_items related to first Picture instance in Picture.objects.all()]
>>> [queryset of all order_items related to second Picture instance... etc.]
先前的答案不正確。 您將以這種方式殺死數據庫。 如果您需要的不僅僅是計數信息,則應使用prefetch_related
,否則在循環時它將在每次迭代中訪問數據庫。
如果您需要多個事件的多個訂單,那么存在多對多關系https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/
由於您只需要計算事件的訂單數,因此更加容易。 讓我們以唯一的related_name
的方式命名每個外鍵:
class Picture(models.Model):
event = models.ForeignKey(Event, related_name='event_pictures')
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='ordered_items')
picture = models.ForeignKey(Picture, related_name='picture_orders')
現在,對我來說,當場瀏覽數據庫有點困難,但是您應該可以執行以下操作:
Events.objects.annotate(Count('event_pictures__picture_orders__order'))
可能需要修改或添加一個不同的內容。 但是,您絕對應該使用這種方法,而不是python中的任何迭代。 那將完全殺死該應用程序。 但是,如果您絕對需要,那么一定要使用prefetch_related('event_pictures__picture_orders__order')
,如前所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.