簡體   English   中英

如何在 Django 型號中設置 ManyToOneRel

[英]How to set up ManyToOneRel in Django Models

我有 2 個表Voucher (包含憑證的所有信息)和VoucherCustomer (列出用戶使用的憑證數量)

這是我的model

class Voucher(models.Model):
    code = models.ForeignKey('VoucherCustomer', related_name= 'voucher_code', on_delete = models.CASCADE)  (1)
    start_at = models.DateTimeField()                                                                      (2)
    end_at = models.DateTimeField()                                                                        (3)
    usage_limit_per_customer = models.BigIntegerField()                                                    (4)
    times_used = models.BigIntegerField()                                                                  (5)                                                                           
    usage_limit_daily = models.BigIntegerField()                                                           (6)
    times_used_daily = models.BigIntegerField()                                                            (7)
    is_global = models.BooleanField(blank=True, null=True)                                                 (8)
    is_active = models.BooleanField()                                                                      (9)

class VoucherCustomer(models.Model):
    voucher_code = models.ManyToOneRel(field = "voucher_code", field_name = "voucher_code", to = "code")(1)
    customer_id = models.IntegerField()                                                                    (2)
    times_used = models.BigIntegerField(blank=True, null=True)                                             (3)
    created_at = models.DateTimeField(blank=True, null=True)                                               (4)
    updated_at = models.DateTimeField(blank=True, null=True)                                               (5)

這是sample data

+++++++ Voucher ++++++++
 (1)             (2)                   (3)           (4)   (5)    (6)   (7)   (8)    (9)
TEST01 | 2020-11-30 17:00:00 | 2021-03-01 16:59:59 | 100 | 1124 | 5000 | 6 | true | true

+++++++ VoucherCustomer ++++++++
(1)     (2)    (3)            (4)                         (5)   
TEST01 10878    9   2020-12-03 02:17:32.012722  2020-12-08 10:32:03.877349
TEST01 12577    1   2020-12-02 07:17:34.005964  2020-12-02 07:17:34.005964
TEST01 8324    18   2020-12-02 07:49:37.385682  2021-02-01 14:35:38.096381
TEST01 7638     2   2020-12-02 08:17:46.532566  2020-12-02 08:17:46.532566
TEST01 3589     1   2020-12-02 14:57:01.356616  2020-12-02 14:57:01.356616

我不太確定如何以及在模型參數中添加什么models.ManyToOneRel的ManyToOneRel。

當我運行此代碼時:

query = Voucher.objects.filter(
            start_at__lte = now,
            end_at__gte = now,
            is_active = True,
            times_used__lt = F('usage_limit'),
            times_used_daily__lt = F('usage_limit_daily'),
            VoucherCustomer__customer_id = customer
            ).annotate(
                usage_so_far=Coalesce('VoucherCustomer__times_used', Value(0))
            ).filter(
                usage_so_far__gte=F('usage_limit_per_customer')
            ).order_by('created_at').values()

我收到了這個錯誤:

Cannot resolve keyword 'VoucherCustomer' into field. Choices are: code, start_at...

根據this question from 2013 models.ManyToOneRel僅在django中使用,不屬於api。 ManyToOneRel 和 ForeignKey 的區別?

由於您擁有客戶,因此您可以獲得與該客戶相關聯的所有優惠券,例如

query = customer.voucher_set.filter(             
            start_at__lte = now,
            end_at__gte = now,
            is_active = True,
            times_used__lt = F('usage_limit'),
            times_used_daily__lt = F('usage_limit_daily'),
  
            ).annotate(
                usage_so_far=Coalesce('VoucherCustomer__times_used', Value(0))
            ).filter(
                usage_so_far__gte=F('usage_limit_per_customer')
            ).order_by('created_at').values()
)

注意我沒有測試它,希望我能正確理解你的問題。

暫無
暫無

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

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