【问题标题】:Ternary model association in DjangoDjango中的三元模型关联
【发布时间】:2018-08-05 23:12:14
【问题描述】:

我已经为这样的 UML 类图建模

我想将此关联转换为 Django。我有以下内容:

class Crypto(models.Model):
    cryptoName = models.CharField(max_length=64, primary_key=True)

class Worker(models.Model):
    name = models.CharField(max_length=64)
    lastname = models.CharField(max_length=64)
    email = models.EmailField(max_length=128, primary_key=True)
    tlf = models.CharField(max_length=20)

    cryptos = models.ManyToManyField(Crypto)

class Operation(models.Model):
    refNum = models.IntegerField()
    datetime = models.DateTimeField()
    amount = models.FloatField()
    amountCrypto = models.FloatField()

我一直在尝试代表三元关联。 Django 拥有ManyToManyFieldthrough attr,但是,正如您所看到的,该关联无论如何都不是m2m,而主要是一对多。那么用 Django 模型表示这种三元关联的最佳方式是什么?


编辑:将在数据库中注册加密货币,工作人员可以做的是启用尽可能多的使用(或禁用,如果是这种情况)。

【问题讨论】:

    标签: python django django-models uml


    【解决方案1】:

    如果你想要一个工人有很多加密货币。然后有两个用例将定义您必须使用的ManyToManyFieldForeignKey

    如果所有用户的加密货币对象总是彼此不同。

    例如,如果用户正在注册自己并且可以创建 有自己的加密货币总是与现有的不同 货币。

    您必须在 Crypto 模型中添加 ForeignKey,而不是在 Worker 模型中使用 ManyToManyField

    class Crypto(models.Model):
        cryptoName = models.CharField(max_length=64, primary_key=True)
        worker = models.ForeignKey(Worker, related_name='cryptos')
    
        def __str__(self):
           return self.cryptoName
    

    从 Worker 模型中移除加密 ManyToManyField 关系

    这样,您可以拥有许多与工作人员相关的密码,并且您可以使用该字段中提到的related_name 访问工作人员的密码

    worker = Worker.objects.first()
    worker.cryptos
    # output: <QuerySet [<Crypto: IOT>, <Crypto: BTC>, ...]>
    

    如果用户在注册时可以从已经可用的加密货币中进行选择

    这意味着多个用户正在链接同一个加密对象 并且用户可以选择尽可能多的货币。

    您必须像现在一样使用ManyToManyField

    您可以使用

    简单地访问工人的这些货币对象
    worker.cryptos
    # output: <QuerySet [<Crypto: IOT>, <Crypto: BTC>, ...]>
    

    要将加密货币链接到工作人员,您可以使用.add()

    crypto = Crypto.objects.get(cryptoName='BTC')
    worker.cryptos.add(crypto)  
    

    更新

    当你创建 ManyToManyField 关系时,会在后台创建一个表来保存两个模型的引用,但是如果你想创建自己的中间表,你必须使用 through 关键字同时定义 ManyToManyField

    class Worker(models.Model):
        ...
        # rest of the fields 
        cryptos = models.ManyToManyField(Crypto, through='Operation', related_name='workers')
    

    并将两个模型的外键手动添加到Operation模型。

    class Operation(models.Model):
        ...
        # rest of fields
        worker = models.ForeignKey(Worker, related_name='operation')
        crypto = models.ForeignKey(Crypto, related_name='operation')
    

    查看official docs 了解有关如何使用它的更多信息。

    【讨论】:

    • 谢谢!我认为使用外键就足够了,因为在这种情况下,我希望所有不同的工人拥有他们注册的尽可能多的货币。但是,我认为多对多关系(如果我没记错的话就是这种情况)在 Django 中由 ManyToManyField 表示,而在一对多关系的情况下使用外键.您是否建议我修改类图,以便 handles Worker 和 Cryptocurrency 之间的关联变为一对多?
    • @oneberenjena 不,有两个用例,请查看我更新的答案。
    • 现在我明白了。这正是我的需要,因为用户可以在他们的应用程序中启用/禁用加密货币,但他们无法注册任何想要创建不同对象的加密货币。谢谢你。但是我仍然停留在表示 WorkerCryptoOperation 之间的三元关联。
    • 查看我回答中的更新部分,你一定需要through关键字
    • @oneberenjena 有帮助吗?
    猜你喜欢
    • 2023-03-15
    • 2017-06-15
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多