python - 如何在 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.ManyToOneRel
Django 的参数中添加什么。
当我运行此代码时:
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()
)
注意我没有测试它,希望我能正确理解你的问题。
推荐阅读
- linux-kernel - 中断控制器的linux驱动程序:字符或平台
- java - How to get keys of a LinkedHashMap sorted by their entry’s value?
- jquery - 尝试查看数据表时,$(...).DataTable 不是函数错误
- javascript - Mongodb + spring,spring实现deleteOne
- ansible - 在树莓派上进行 ansible Ping 测试
- c++ - C++ 将宏视为一个类
- python - Gunicorn ImportError:无法从 docker 中的“eventlet.wsgi”导入名称“ALREADY_HANDLED”
- node.js - 节点 JS,验证码解决
- terraform - terraform flatten loop 3次
- python - 为什么 Pandas replace() 方法不起作用?