如何在另一个表的特定属性上设置ForeignKey?

时间:2018-11-14 15:38:23

标签: python django shell django-models revitpythonshell

这是我的头等舱客轮,意味着客户。它有一个id,一个客户名,来自该客户的用户是一个ManyToManyField,它引用了User表django给我的用户。

class Klant(models.Model):
    id = models.AutoField(primary_key=True)
    klant_naam = models.CharField(max_length=100, default='-')
    klant_gebruiker = models.ManyToManyField(User)

    def __str__(self):
        return str(self.id) + " - " + self.klant_naam

这是Actie(操作或用户确定的操作)类别,其中具有ID,操作名称,操作发布日期,结束日期(截止日期),客户ID所指我想从表Klant中引用klant_gebruiker和Klant和actie_gebruiker。

class Actie(models.Model):
    id = models.AutoField(primary_key=True)
    actie_naam = models.CharField(max_length=150, default='-')
    actie_aanmaakdatum = models.DateTimeField(default=datetime.now())
    actie_einddatum = models.DateTimeField(default=datetime.now() + timedelta(days=1))
    actie_klant = models.ForeignKey(Klant, default=1)
    actie_gebruiker = models.ForeignKey(Klant.klant_gebruiker, default=1)

    def __str__(self):
        return str(self.id) + " - " + self.actie_naam

所以我现在的问题是我该怎么做才能将表Klant中的actie_gebruiker的值设置为属性klant_gebruiker?

2 个答案:

答案 0 :(得分:0)

我相信您需要对ManyToManyField定义使用through参数。

class Klant(models.Model):
    id = models.AutoField(primary_key=True)
    klant_naam = models.CharField(max_length=100, default='-')
    klant_gebruiker = models.ManyToManyField(User, through='Actie')

    def __str__(self):
        return str(self.id) + " - " + self.klant_naam


class Actie(models.Model):
    id = models.AutoField(primary_key=True)
    actie_naam = models.CharField(max_length=150, default='-')
    actie_aanmaakdatum = models.DateTimeField(default=datetime.now())
    actie_einddatum = models.DateTimeField(default=datetime.now() + timedelta(days=1))
    actie_klant = models.ForeignKey(Klant)
    actie_gebruiker = models.ForeignKey(User)

    def __str__(self):
        return str(self.id) + " - " + self.actie_naam

答案 1 :(得分:0)

您想要的是ForeignKeyField上的to_field参数 在你的情况下 actie_gebruiker = models.ForeignKey(Klant, to_field='klant_gebruiker' default=1)

但是有一个问题,您的klant_gebruiker是ManyToManyField。 这意味着在数据库中,还有另一个连接表,该表保留指向Klant的前键,而保留至目标表的前一个键(在您的示例中为User)。 您的表中实际上不存在klant_gebruiker。

您可以做的是创建一个穿透表,并使actie_gebruiker指向指向Klant Table的外键字段,但是可以有多个这样的记录