python - 在 Django 中创建多个相关对象的最佳实践
问题描述
我正在使用数据模型资源书中的 Party 域模型。为了说明这种情况,下面是模型的简化版本。
例如,当一个组织是客户时。我将创建(派对、组织、角色(类型=客户)、客户)模型的组合。
这是一个相对简单的任务。虽然这个逻辑通常会去哪里。
1-一个简单的功能 from module import create_organization_customer
。
- 这种方法在服务模式的倡导者中比较流行。虽然感觉不像 Django。
2- 在表格内ModelForm.save()
或Form.create()
.
- 我喜欢这个,但随后添加了rest_framework。会让我将逻辑复制到
Serializer.create()
. ETC..
3- 在经理内部Customer.objects.create()
或customer.objects.create_customer()
.
- 这个很干净,感觉更像是 Django 做事的方式。
Queryset
但是,当它跨越边界时,我不确定如何看待它。
4-覆盖模型上的保存Customer.save()
。
- 我认为这是一个流行的解决方案。虽然我不确定它是最干净的。
class Party(models.Model):
party_id = models.CharField(max_length=100, unique=True)
class Person(models.Model):
party = models.OnetoOneField(Party, related_name="person", primary_key=True, on_delete=models.CASCADE)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
class Organization(models.Model):
party = models.OnetoOneField(Party, related_name="organization", primary_key=True, on_delete=models.CASCADE)
legal_name = models.CharField(max_length=255)
class Role(models.Model):
class TypeChoices(models.TextChoices):
CUSTOMER = 'customer', 'Customer'
VENDOR = 'vendor', 'Vendor'
PARTNER = 'partner', 'Partner'
type = models.CharField(max_length=100, choices=TypeChocies.choices)
party = models.ForeignKey(Party, related_name="roles", primary_key=True, on_delete=models.CASCADE)
class Customer(models.Model):
role = models.OnetoOneField(Role, related_name="customer", primary_key=True, on_delete=models.CASCADE)
party = models.OneToOneField(Party, related_name="customer", on_delete=models.CASCADE)
credit_limit = models.DecimalField(max_digits=12, decimal_places=2)
class Vendor(models.Model):
role = models.OnetoOneField(Role, related_name="vendor", primary_key=True, on_delete=models.CASCADE)
party = models.OneToOneField(Party, related_name="vendor", on_delete=models.CASCADE)
account_number = models.CharField(max_length=70)
class Partner(models.Model):
role = models.OnetoOneField(Role, related_name="partner", primary_key=True, on_delete=models.CASCADE)
party = models.OneToOneField(Party, related_name="partner", on_delete=models.CASCADE)
license_number = models.CharField(max_length=50)
解决方案
推荐阅读
- jupyter-notebook - shell command # can't be carry out when it not used for comments on colab
- office-js - Officejs loaded out side of Excel when putting TaskPane in iframe
- angular - Angular:试图让 ngx-pagination 工作
- r - 如何平均图函数并找到R中的置信带
- c# - Docker:使用 docker 和 netcore3.1 将文件写入物理或共享路径
- c++ - 为什么我不能从文本文件创建矢量对象?
- html - 在 if 块内部时,在单词 Jinja 之间的空格后强制换行
- google-apps-script - 用于发送电子邮件的 Google 表单脚本
- c# - Flurl Client - 是否可以从失败的请求中访问标头?
- sql - 按两个连接的列分组