我已经像这样建模了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具有through
的{{1}}属性,但是,正如您所看到的,该关联绝不是m2m,而是多对多的。那么用Django模型表示这种三元关联的最佳方法是什么?
编辑:数据库中将注册加密货币,并且工作人员可以执行的操作是使用所需数量的数字(如果需要,可以禁用)。
答案 0 :(得分:2)
如果您想要一个工人拥有许多加密货币。然后有两个用例将定义您必须使用ManyToManyField
或ForeignKey
的内容。
例如,如果用户正在注册自己并可以创建 有自己的加密货币,它们总是与现有的不同 货币。
您必须在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 关系时,将在后台创建一个表,该表保留两个模型的引用,但是如果要创建自己的中间表,则必须使用{{1} }关键字,同时定义 ManyToManyField
through
并将两个模型的外键手动添加到class Worker(models.Model):
...
# rest of the fields
cryptos = models.ManyToManyField(Crypto, through='Operation', related_name='workers')
模型中。
Operation
查看
official docs
以获得有关如何使用它的更多信息。