在 Django 中将一个模型与一组另一个模型链接

Zar*_*ifS 1 python database django

我目前正在开发一个数据库和 API 系统,用户可以在其中创建包含代币列表的投资组合。我正在使用 Django,我到处搜索,但我一直看到外键,但我不确定这就是我在这种情况下需要的。

我想要两种模型,一种用于用户可以查询的投资组合,另一种用于用户也可以查询的硬币模型。然而,在投资组合中应该有一个代币列表。我知道如何在 Java 中使用对象来执行此操作,但不确定 Django 中的方法。

这是我的模型类:

from django.db import models


class Portfolio(models.Model):
    name = models.CharField(max_length=250)

    def __str__(self):
        return self.name


class Coin(models.Model):
    name = models.CharField(max_length=100)
    symbol = models.CharField(max_length=5)
    price = models.DecimalField(max_digits=20, decimal_places=9)
    info = models.TextField()
    website = models.TextField()
    rank = models.IntegerField()

    def __str__(self):
        return self.name + " - " + self.symbol
Run Code Online (Sandbox Code Playgroud)

现在我理想情况下会拥有类似coins = list of Coins model使用 java 来创建对象的东西,但由于这是用于数据库并且在 Django 中,我不确定应该如何链接这两者。

我见过相关的对象,但不明白我的问题的解释。我应该如何建立这些模型?谢谢。

小智 5

听起来您想要拥有多个Portfolio对象,每个对象都可以对Coin对象进行不同的投资。在这种情况下,您需要使用ManyToManyField

class Portfolio(models.Model):
    name = models.CharField(max_length=250)
    coins = models.ManyToManyField(Coin)
Run Code Online (Sandbox Code Playgroud)

然后,数据库将存储哪个投资组合持有哪种代币的二维表。

然而,您可以尝试的另一种方法是创建一个单独代表投资的对象:

class Investment(models.Model):
    portfolio = models.ForeignKey(Portfolio)
    coin = models.ForeignKey(Coin)
    bought = models.DateTimeField() # date the investment was made
    sold = models.DateTimeField() # date the investment was sold
    amount = models.DecimalField() # number of coins held
Run Code Online (Sandbox Code Playgroud)

然后,您可以将属性添加到投资组合中:

class Portfolio(models.Model):
    name = models.CharField(max_length=250)

    @property
    def coins(self):
        return Investment.objects.filter(portfolio=self)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您不仅可以跟踪哪个投资组合持有哪些代币,还可以购买整个历史头寸。