【问题标题】:Django: Creating editable default values for model instance based on foreignkey existanceDjango:根据外键存在为模型实例创建可编辑的默认值
【发布时间】:2015-05-14 17:27:51
【问题描述】:

我在 Django 中玩耍,想知道是否有一种方法可以循环遍历我创建的两个不同模型的实例?

/ models.py:

class Tran(models.Model):
    name = models.CharField(max_length=300)
    description = models.CharField(max_length=2000)
    type = models.ForeignKey(TransactionType)
    def __str__(self):
        return self.name

 class DocLink(models.Model):
    trann = models.ForeignKey(Transaction)
    t_link = models.CharField(max_length=2000)
    t_display = models.CharField(max_length=1000)
    p_display = models.CharField(max_length=300)
    p_link = models.CharField(max_length=2000)
    def __str__(self):
        return self.link

我想做什么:

查看每个 Tran 实例并为 DocLink 表中的链接/显示创建默认值,而不是手动执行。

无论如何我可以指出正确的方向吗?

【问题讨论】:

    标签: python django database models


    【解决方案1】:

    如果您想根据 trann 字段在 DocLink 实例中设置链接/显示默认值,您可以覆盖模型的保存方法。

    例如,下面的代码显示了如果 t_link 没有值,如何设置它:

    class DocLink(models.Model):
        trann = models.ForeignKey(Transaction)
        t_link = models.CharField(max_length=2000)
        t_display = models.CharField(max_length=1000)
        p_display = models.CharField(max_length=300)
        p_link = models.CharField(max_length=2000)
        def __str__(self):
            return self.link
    
        def save(self, *args, **kwargs):
            if not self.t_link:
                pass # TODO set self.t_link based on trann
    
            super(DocLink, self).save(*args, **kwargs)
    

    您还可以将模型的 trann 字段更改为:

    trann = models.ForeignKey(Transaction, related_name="doclinks")
    

    然后使用以下命令访问 Tran 的所有 DocLink:

    # t is an instance of Tran class
    
    t.doclinks.all()
    

    所以你可以遍历这个列表并做你想做的事。

    【讨论】:

    • 嗯,这有道理,但我有点困惑的部分,我将如何设置每个 t_links 和 p_links,例如“google.com”?跨度>
    • 另外,我在我的数据库中创建了我手动输入的 Tran 类的实例。因为 doclink 的实例存在很大程度上依赖于 Tran 实例的存在,所以代码是否允许我创建与匹配的 tran 实例相关的 doclinks 类的实例? doclink 类的目的只是添加包含由 tran 类创建的实例的文档的链接。我希望我表达得很好!
    • @adropofilm 如果您的链接是静态的,例如您总是想将它们设置为“google.com”,您必须使用默认关键字。 (t_link = models.CharField(max_length=2000, default="google.co"). 但如果不是,则在上面的代码中,您必须使用所需条件设置它们,而不是“通过”。如果 self.trann.name=="foo ": self.t_links = "google.com"
    • @adropofilm 关于你的第二条评论我没明白这一点。在此代码中,您手动创建 Tran 的实例并不重要,或者不仅 DocLink 的实例很重要。当您在将 DocLink 实例存储到数据库之前使用 django save() 方法时(使用 super(DocLink, self).save(*args, **kwargs)),您可以更改要更改的值。我不知道你评论的答案是否,让我知道它是否无关紧要。
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2011-02-26
    • 2016-08-07
    • 1970-01-01
    • 2020-05-14
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多