Django 模型依赖和转移所有权

Django models dependencies and transfer ownership

我正在尝试构建的是一个可以处理蜂蜜生产管理的应用程序。 有许多生产蜜罐的生产商,他们可以将蜜罐提供给有顾客的各种商店。一个生产者可以将他的产品提供给许多商店,一个商店可以有许多生产者的蜜罐。 pot_id 可以追踪蜜罐。 models.py 看起来像这样:

class Produser(models.Model):
    name = models.CharField(max_length=255)
    address = models.CharField(max_length=255)

class Store(models.Model):
    name = models.CharField(max_length=255)
    address = models.CharField(max_length=255)
    produser= models.ManyToManyField(Produser)

class Customer(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    store = = models.ForeignKey(Store, on_delete=models.CASCADE)

class HoneyPot(models.Model):
    produced_date = models.DateField(auto_now=False)
    pot_id = models.CharField(max_length=25, blank=False)
    produser= models.ForeignKey(Produser, on_delete=models.CASCADE)
    store= models.ForeignKey(Store, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)

我正在努力寻找如何修改模型,以让一个锅拥有或由生产商、商店或客户拥有。就像现在创建一个新的罐子商店和客户是必填字段。

可以说ProduserStoreCustomer都有一些共同点,即他们可以拥有一个HoneyPot。这意味着它们是比方说可以拥有 HoneyPot 的实体的特化。为了对此建模,我们只需添加一个额外的模型,ProduserStoreCustomer 都将继承自或与其具有一对一关系。

使用 OneToOneField [Django docs]:

我们可以简单地通过使用 OneToOneField:

来建立关系
class HoneyPotOwner(models.Model):
    PRODUCER = 'P'
    STORE = 'S'
    CONSUMER = 'C'
    TYPE_CHOICES = [
        (PRODUCER, 'Producer'),
        (STORE, 'Store'),
        (CONSUMER, 'Consumer'),
    ]
    owner_type = models.CharField(max_length=1, choices=TYPE_CHOICES)

class Produser(models.Model):
    honey_pot_owner = models.OneToOneField(HoneyPotOwner, on_delete=models.CASCADE)
    ...

class Store(models.Model):
    honey_pot_owner = models.OneToOneField(HoneyPotOwner, on_delete=models.CASCADE)
    ...

class Customer(models.Model):
    honey_pot_owner = models.OneToOneField(HoneyPotOwner, on_delete=models.CASCADE)
    ...

class HoneyPot(models.Model):
    produced_date = models.DateField(auto_now=False)
    pot_id = models.CharField(max_length=25, blank=False)
    owner = models.ForeignKey(HoneyPotOwner, on_delete=models.CASCADE)

使用Multi-table inheritance:

我们可以让ProduserStoreCustomer继承自HoneyPotOwner,这叫做多table继承。这隐含地使 OneToOneField,但有一些优势,即访问相关字段变得更容易:

class HoneyPotOwner(models.Model):
    PRODUCER = 'P'
    STORE = 'S'
    CONSUMER = 'C'
    TYPE_CHOICES = [
        (PRODUCER, 'Producer'),
        (STORE, 'Store'),
        (CONSUMER, 'Consumer'),
    ]
    owner_type = models.CharField(max_length=1, choices=TYPE_CHOICES)

class Produser(HoneyPotOwner):
    ...

class Store(HoneyPotOwner):
    ...

class Customer(HoneyPotOwner):
    ...

class HoneyPot(models.Model):
    produced_date = models.DateField(auto_now=False)
    pot_id = models.CharField(max_length=25, blank=False)
    owner = models.ForeignKey(HoneyPotOwner, on_delete=models.CASCADE)