django - 如何将字段值从一个模型对象传递到另一个模型对象?
问题描述
哦,我的...这是一个基本问题,但我尝试了很多解决方案,但对我没有任何帮助,我找不到与我类似的问题...
我有两个模型:
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 不起作用...谢谢您的帮助!
解决方案
为什么需要将该代码存储在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
使用code
with ForQuery
queryset,如下所示:
from django.db.models import F
class DirDetailView(generic.DetailView):
model=ForQuery
queryset = ForQuery.objects.annotate(code=F('dep_sch__code'))
# template
{{ object.code }}
根据评论更新
在这种情况下,您可能应该覆盖ForQuery
save 方法:
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)
推荐阅读
- azure - Video Indexer 每次上传都会创建新容器
- r - R中两个大数据框之间的不常见行
- forms - LibreOffice 基本搜索表单过滤器
- javascript - 在 MutationObserver 上返回 true
- mysql - 将行从一个表复制到另一个表时如何解决数据截断错误,两个表具有相同的模式?
- kotlin-multiplatform - 如何使用 Kotlin/native 生成依赖于另一个的 .framework?
- java - 在 Univocity Parser 中将 ResultSet 格式化为特定的 DecimalFormat
- apache - 始终在根目录而不是子目录中执行 index.php
- python - Zoom api 问题 - 访问令牌无效 - JWT
- python - 从列表中更新 json 列表