首页 > 解决方案 > 在 Django 中创建多个相关对象的最佳实践

问题描述

我正在使用数据模型资源书中的 Party 域模型。为了说明这种情况,下面是模型的简化版本。

例如,当一个组织是客户时。我将创建(派对、组织、角色(类型=客户)、客户)模型的组合。

这是一个相对简单的任务。虽然这个逻辑通常会去哪里。

1-一个简单的功能 from module import create_organization_customer

2- 在表格内ModelForm.save()Form.create().

3- 在经理内部Customer.objects.create()customer.objects.create_customer().

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)

标签: pythondjangoormrelationshipdatamodel

解决方案


推荐阅读