【问题标题】:How can I set a ForeignKey on a specific attribute from another table?如何在另一个表的特定属性上设置 ForeignKey?
【发布时间】:2018-11-14 15:38:22
【问题描述】:

这是我的头等舱 Klant,意思是客户。它有一个 id、一个客户名称和来自客户的用户,这是一个 ManyToManyField,指的是 django 给我的 User-table 中的用户。

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 和 actie_gebruiker,我想从 Klant 表中引用 klant_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

所以我现在的问题是如何将 actie_gebruiker 的值设置为 Klant 表中的属性 klant_gebruiker?

【问题讨论】:

    标签: python django shell django-models revitpythonshell


    【解决方案1】:

    我相信您需要为 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
    

    【讨论】:

    • 首先:我已经尝试了两种不同的方式,但两种方式都不起作用。事实上,如果我没有备份,它会搞砸我的整个项目。然后我想你误会了,如果我没有将默认值定义为 ForeignKey 的参数,我希望 Actie.actie_gebruiker 指的是 Klant.klant_gebruiker 而不是 Klant.klant_gebruiker 指的是 Actie.klant_gebruiker,Python-Shell 给了我一个错误告诉我必须定义一个默认值。
    【解决方案2】:

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

    但是有一个问题,你的 klant_gebruiker 是一个 ManyToManyField。 这意味着在数据库中,还有另一个连接表,它保留一个指向 Klant 的外键和一个指向目标表的外键,在您的示例中是用户。 klant_gebruiker 实际上并不存在于您的表中。

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

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多