首页 > 解决方案 > 如何在 Django 模型中设置 ManyToOneRel

问题描述

我有 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.ManyToOneRelDjango 的参数中添加什么。

当我运行此代码时:

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...

标签: pythondjango

解决方案


根据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()
)

注意我没有测试它,希望我能正确理解你的问题。


推荐阅读