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)
我正在努力寻找如何修改模型,以让一个锅拥有或由生产商、商店或客户拥有。就像现在创建一个新的罐子商店和客户是必填字段。
可以说Produser
、Store
和Customer
都有一些共同点,即他们可以拥有一个HoneyPot
。这意味着它们是比方说可以拥有 HoneyPot
的实体的特化。为了对此建模,我们只需添加一个额外的模型,Produser
、Store
和 Customer
都将继承自或与其具有一对一关系。
使用 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:
我们可以让Produser
、Store
和Customer
继承自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)
我正在尝试构建的是一个可以处理蜂蜜生产管理的应用程序。 有许多生产蜜罐的生产商,他们可以将蜜罐提供给有顾客的各种商店。一个生产者可以将他的产品提供给许多商店,一个商店可以有许多生产者的蜜罐。 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)
我正在努力寻找如何修改模型,以让一个锅拥有或由生产商、商店或客户拥有。就像现在创建一个新的罐子商店和客户是必填字段。
可以说Produser
、Store
和Customer
都有一些共同点,即他们可以拥有一个HoneyPot
。这意味着它们是比方说可以拥有 HoneyPot
的实体的特化。为了对此建模,我们只需添加一个额外的模型,Produser
、Store
和 Customer
都将继承自或与其具有一对一关系。
使用 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:
我们可以让Produser
、Store
和Customer
继承自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)