Django建立依赖关系模型并转移所有权 [英] Django models dependencies and transfer ownership

查看:14
本文介绍了Django建立依赖关系模型并转移所有权的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建的是一个可以处理蜂蜜生产管理的应用程序。 有许多生产蜜罐的生产商,他们可以把他们的蜜罐提供给各种有客户的商店。一个生产商可以将他的产品提供给许多商店,一个商店可以有来自许多生产商的蜜罐。蜜罐可以通过pot_id进行跟踪。Mods.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)

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

推荐答案

可以说<[2-0]、StoreCustomer都有一个共同点,就是可以拥有一个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,这称为多表继承。这隐式地创建了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)

这篇关于Django建立依赖关系模型并转移所有权的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆