首页 > 解决方案 > 如何将字段值从一个模型对象传递到另一个模型对象?

问题描述

哦,我的...这是一个基本问题,但我尝试了很多解决方案,但对我没有任何帮助,我找不到与我类似的问题...

我有两个模型:

class ForQuery(models.Model):
    id=models.BigAutoField(primary_key=True)
    dep_sch = models.ForeignKey('DepDict', models.DO_NOTHING, 
    db_column='dep_sch', blank=True, null=True)
    code_dep_sch = models.CharField(max_length=5, blank=True, 
    null=True)

class DepDict(models.Model):
    department = models.CharField(primary_key=True, 
    max_length=35)
    code = models.CharField(max_length=5)

我有这些模型的所有最小元数据,包括 get_absolute_url 和str。我已经为我在模板中使用的视图中的函数定义了 url。我在 DepDict 中的部门和 ForQuery 中的 dep_sch 和模板中匹配这两个模型,基于此匹配,我可以轻松打印 dartment 的代码,如下所示:

        {% for d in c%}
            {% if forquery.dep_station == d %}
                {{ d.code }}
            {% endif %}
        {% endfor %}

现在,基于此匹配,我无法将 DepDict 中的引用字段代码保存到 ForQuery 中的字段 code_dep_sch 中。我将如何处理这项任务?到目前为止,我的视图功能如下所示:

class DirDetailView(generic.DetailView):
    model=ForQuery
    def get_context_data(self, **qwargs):
        content = super(MetalDetailView, self).get_context_data(**qwargs)
        content['c'] = DepDict.objects.all()
        self.code_dep_sch = c.code #this didn't work
        self.save()
        return conObject

尝试使用 object.field_name 不起作用...谢谢您的帮助!

标签: djangodjango-viewsdjango-templates

解决方案


为什么需要将该代码存储在ForQuery模型中,您可以使用属性方法或仅使用普通实例方法从 ForeignKey 关系直接访问它:

class ForQuery(models.Model):
    id=models.BigAutoField(primary_key=True)
    dep_sch = models.ForeignKey('DepDict', models.DO_NOTHING, 
    db_column='dep_sch', blank=True, null=True)

    @property
    def code_dep_sch(self):
       if self.dep_sch:
          return self.dep_sch.code
       return ''

并在模板中使用它:

{{ object.code_dep_sch }}

替代解决方案

如果您一般不想使用属性方法或函数,则annotate使用codewith ForQueryqueryset,如下所示:

from django.db.models import F

class DirDetailView(generic.DetailView):
    model=ForQuery
    queryset = ForQuery.objects.annotate(code=F('dep_sch__code'))

# template

{{ object.code }}

根据评论更新

在这种情况下,您可能应该覆盖ForQuerysave 方法:

class ForQuery(models.Model):
    ...
    def save(self, *args, **kwargs):
        if self.dep_sch:
          self.code_dep_sch = self.dep_sch.code
        super(ForQuery, self).save(*args, **kwargs)

推荐阅读