簡體   English   中英

如何使用2個外鍵過濾Django模型?

[英]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.

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