【问题标题】:How to set up ManyToOneRel in Django Models如何在 Django 模型中设置 ManyToOneRel
【发布时间】:2021-05-22 01:26:03
【问题描述】:

我有 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

我不太确定如何以及在 Django 的 models.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...

【问题讨论】:

    标签: python django


    【解决方案1】:

    根据this question from 2013 models.ManyToOneRel 仅在django 中使用,而不是api 的一部分。 Difference between ManyToOneRel and 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()
    )
    
    

    请注意,我没有对其进行测试,希望我能正确理解您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2015-09-03
      • 2012-11-19
      • 2012-11-18
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多