django模型引用其他类的对象

Posted

技术标签:

【中文标题】django模型引用其他类的对象【英文标题】:django model referencing object from other class 【发布时间】:2015-04-23 08:54:51 【问题描述】:

您好,对 django 来说非常新,但考虑到以下模型及其关系,如何为引用另一个类中的字段的对象创建只读字段?我在 *** 上找了一段时间,但不确定会是哪种模型参考。

这个的基本逻辑是: 我有这个服务器机架,它位于服务器机房的地板上,我将它与机架位置相关联,并通过行来管理功耗和其他好东西。只是为了我的最终用户的参考,我想要一个只读字段来向他们展示这个机架所在的行,以及它来自机架位置。我一直在摆弄创建一种方法来查找它,但似乎无法弄清楚语法或在 django 管理页面上找到相关的东西。

任何想法都会非常感谢,我真的可以使用帮助,因为我一直盯着文档看,似乎找不到相关的模型参考。

class rack(models.Model):
    class Meta:
        verbose_name = "Rack"
        verbose_name_plural = "Racks"

    def __unicode__(self):
        return str(self.position)

    def row(self, obj):
        return self.position.row

    position = models.OneToOneField("rackposition")
    row = row(position.row.row)
    asstag = models.CharField("Asset Tag", max_length=200, unique=True)
    rackunits = models.IntegerField("Rack Units")

class rackposition(models.Model):
    class Meta:
        verbose_name = "Rack Position"
        verbose_name_plural = "Rack Positions"

    def __unicode__(self):
        return str(self.position)

    position = models.CharField("Position", max_length=35, primary_key=True)
    row = models.ForeignKey("row")

class row(models.Model):
    class Meta:
        verbose_name = "Row"
        verbose_name_plural = "Rows"

    def __unicode__(self):
        return str(self.row) + "." + str(self.suite)

    row = models.CharField("Row ID", max_length=200, unique=True)
    suite = models.ForeignKey(suite, blank=False)
    power_budget = models.IntegerField("Power Budget")
    power_volt = models.IntegerField("Power Voltage")
    dual_bus = models.BooleanField("Dual Bus", default=False)

【问题讨论】:

【参考方案1】:

您不需要方法。假设您有一个名为my_rack 的机架实例,您可以使用my_rack.position.row 获取它的行。

注意,你应该真正遵循 PEP8 并使用 CamelCase 作为你的类名。

如果您想在管理员中将其视为只读字段,则需要在模型或 ModelAdmin 类上定义一个方法。例如:

class RackAdmin(admin.ModelAdmin):
    model = Rack
    readonly_fields = ('row',)

    def row(self, obj):
        return obj.position.row

【讨论】:

这是一个只读字段吗? row = my_rack.position.row 对不起,我不明白这个问题。 对不起,丹尼尔让我澄清一下。如果我希望它出现在管理对象字段上,当您单击一个对象时,那将是什么模型参考?它实际上不是数据库中的一个字段,所以是否有一个参考可以用于表单中的通用只读字段?还是我必须自己创建? 啊,我没有意识到你想要它作为一个只读字段。查看我的更新。 models.py 对象字段的逻辑相同吗?我在管理员中获得了它以在列表中使用,但如果最终用户单击该信息将不存在的对象。

以上是关于django模型引用其他类的对象的主要内容,如果未能解决你的问题,请参考以下文章

Django 模型继承和外键

Django 通过外键或其他字段引用模型

使用覆盖保存为抽象模型扩展 Django ModelForm

如何通过引用外键将 Django 模型移动到其他应用程序?

浅析java设计模式----异构容器,可以存储任何对象类型为其他类提供该对象

Django模型:同一模型类的对象之间的一对一关系[重复]