django - Django:添加多对多字段
问题描述
我目前正在努力为我新创建的对象分配多对多字段。任何人都知道我做错了什么?
注意:我想到了一个解决方案,即首先创建票证,然后尝试分配它。这可能是这样做的方式吗?
#Create ticket_tax
assign_event = Event.objects.all()
for event in assign_event:
TicketTax.objects.create(
event=event,
name=lorem,
percentage=0.19,
)
# Create tickets
price_gross = ['40.60', '30.30', '100.40', ]
name = ['Early Bird', 'Regular Ticket', 'Last Minute Ticket', ]
assign_event = Event.objects.all().first()
assign_ticket_tax = TicketTax.objects.all().first()
for i in range(len(price_gross)):
Ticket.objects.create(
event=assign_event,
ticket_tax=assign_ticket_tax.add(),
price_gross=price_gross[i],
name=name[i],
description='ABC',
start_at='2018-05-26 18:12:58.556925+02',
end_at='2018-05-29 18:12:58.556925+02',
quantity=100,
status='On sale',
)
模型.py
class TicketTax(models.Model):
event = models.ForeignKey(
Event,
on_delete=models.PROTECT,
related_name='ticket_taxes'
)
name = models.CharField(max_length=100)
percentage = models.DecimalField(
max_digits=5,
decimal_places=4
)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Ticket(models.Model):
event = models.ForeignKey(
Event,
on_delete=models.PROTECT,
related_name='tickets'
)
ticket_tax = models.ManyToManyField(TicketTax, blank=True)
price_gross = models.DecimalField(
max_digits=25,
decimal_places=2
)
name = models.CharField(max_length=100)
description = models.TextField(blank=True, null=True)
start_at = models.DateTimeField()
end_at = models.DateTimeField()
quantity = models.PositiveIntegerField()
status = models.CharField(
max_length=8,
choices=TicketStatus.CHOICES
)
is_archived = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
解决方案
注意:我想到了一个解决方案,即首先创建票证,然后尝试分配它。这可能是这样做的方式吗?
这是完全正确的。您不能在一个创建语句中实例化一个对象并分配一个 M2M——因为这两个对象都需要存在于数据库中。这在 for 循环中应该(大致)执行您上面的代码尝试执行的操作:
ticket = Ticket.objects.create(
event=assign_event,
price_gross=price_gross[i],
name=name[i],
description='ABC',
start_at='2018-05-26 18:12:58.556925+02',
end_at='2018-05-29 18:12:58.556925+02',
quantity=100,
status='On sale',
)
ticket.ticket_tax.add(TicketTax.objects.all().first())
推荐阅读
- visual-c++ - Visual Studio 如何从代码中读取指令?
- android - Kotlin 代码中无法识别 android.arch.lifecycle.ViewModelProviders
- tensorflow - 如何在 Google colab 上安装 tensorflow 对象检测 API?
- cakephp - $this->paginate() 和 $this->Paginator->paginate() 的区别
- c# - Xunit 防止基类执行测试
- c# - 是使用 java 脚本或 jquery 检查 jquery.unobtrusive-ajax.min.js 是否加载到页面中的任何方法
- azure - 使用 Azure API 调用列出 Azure Active Directory 中用户的所有组
- java - 需要在 Linux 服务器中使用 java Robot 类的替代品
- sql - 分组时如何将字符串组装成数组?
- java - SQL查询查找全天状态的变化