【问题标题】:Accessing Model Data in another model/form以另一个模型/形式访问模型数据
【发布时间】:2019-09-07 15:39:37
【问题描述】:

您好,我已经创建了一个简单的模型,现在我想访问另一个模型中的数据以便稍后查看。

我的模型如下所示:

from django.db import models
class A(models.Model):
    asd = models.CharField(max_length=50,default="DEFAULT VALUE")
    def __str__(self):
        return(self.asd)

现在我想要第二个模型,我从第一个模型中获取数据并将每个元素添加到列表或类似的东西中。对于背景,我正在这样做,所以我可以创建一个下拉小部件,其中包含可以更改和添加到管理页面中的选项。

我最初想创建另一个模型或表单并想出了这个,尽管它不起作用:

#this is not in the model.py file
from .models import A
class B(forms.Form):
    a = A.objects.all()
    b = []
    for i in range(len(a)):
        b.append(a[i])
    c = forms.ChoiceField(choices=b)

【问题讨论】:

  • 在尝试构建它之前,您可能应该遵循 python 和 Django 教程。你的问题太宽泛了,你当前的代码有太多问题表明对基本的python/Django特性缺乏理解。
  • 好吧,因为我的错误消息告诉我 A 不可迭代,它告诉我它不是我使用 .objects.all() 获得的列表。这很令人困惑,因为当使用 shell 并以完全相同的方式尝试我的代码时,我得到了一个包含模型元素的列表 b。主要问题仍然是,我如何访问数据库中模型中的数据以供进一步使用。
  • 由于您没有显示错误,我们不可能知道。但是此代码实际上不会引发该错误。您应该发布实际代码和完整的回溯。尽管如此,正如 Geekfish 所说,这里有几件事你不应该在 Django 或 Python 中更普遍地做。
  • objects.all() 返回QuerySet。仅在 shell 中对其进行测试可能会起作用,但这不是您应该迭代 QuerySet(或与此相关的列表)或在表单中使用它的方式。不要轻视这些都是初学者的正常错误,但正如我所说,当前的实现有太多问题,您可能会发现首先从教程中使用 Django 表单构建东西更有效率。您还应该查看ModelChoiceField,它更适合您的问题。
  • 没有人要求您在评论中发布回溯。编辑问题并将其发布到那里,格式正确。

标签: django python-3.x django-models


【解决方案1】:

Django 允许您使用@classmethod 装饰器创建类方法。您可以使用它将数据从第一个模型传递到第二个模型。看看下面的例子。

第一个模型:

from django.db import models
class A(models.Model):
    asd = models.CharField(max_length=50,default="DEFAULT VALUE")
    def __str__(self):
        return(self.asd)

    # This is important
    @classmethod
    def get_all_choices(cls):
        # I still suggest you to go through Django documentation
        # to understand what query sets are
        return cls.objects.values_list('asd', flat=True)

第二个模型:

from django.db import models
from a.models import A
class B(models.Model):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.choice_array = A.get_all_choices()

    choices = models.CharField(max_length=10, choices=self.choice_array)

请注意 cmet。如果您需要了解如何将 A 导入 B,请参考这个问题 - Django : Unable to import model from another App

我已经这样做了几次,但手头没有设置可以尝试。您可能需要通过阅读错误消息自行解决一些错误。

【讨论】:

  • 我喜欢这种将模型实现到其他模型中的方式,尽管我已经通过使用 forms.ModelChoiceField 和 QuerySet 得到了我想要的东西,但我会记住这一点。谢谢
  • 这是一个非常 hacky/duct tape 尝试做的事情,Django 已经有了简单的功能。这就是为什么ForeignKey 字段存在于模型中,以及为什么ModelFields 存在于表单中。
  • ForeignKey 绝对是您重新开始的方式。但通常,在现有数据集上添加外键可能会导致迁移复杂化(尤其是当应用程序太大以至于您无法追踪影响时)。但由于 OP 专门要求他可以调整表格的情况,我接受这不是正确的答案。
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多