【问题标题】:Change model fields at runtime在运行时更改模型字段
【发布时间】:2015-08-11 07:43:24
【问题描述】:

我有一些模型:

from salesforce.models import SalesforceModel

class Task(SalesforceModel):
    card = models.CharField(max_length=32)
    who = models.ForeignKey(Lead) # here may be Lead or Contact model ID

还有一些更新数据的功能:

def set_contact(contact):
    ...
    # Trying to change
    Task.who = models.ForeignKey(Contact)
    # Or so:
    Task._meta.get_field('who').to = Contact
    task = Task.objects.get(...)
    task.who = contact

当然 django 不允许更改值。

ValueError: Cannot assign "Contact: Some Contact": "Task.who" must bea "Lead" instance.

【问题讨论】:

  • 你确定这行得通吗?如果您有一个“谁”为 341 的任务,您如何知道是查找联系人号码 341 还是潜在客户号码 341?
  • 是的,每条记录都有整个数据库的唯一 ID

标签: python django django-models django-orm


【解决方案1】:

Django 在运行时构建它的模型,之后不允许您更改它们。

你看过django_polymorphic:

from polymorphic import PolymorphicModel

class ContactBase(PolymorphicModel):
    ...

class Contact(ContactBase):
    ...

class Lead(ContactBase):
    ...

class Task(models.Model):
    card = models.CharField(max_length=32)
    who = models.ForeignKey(ContactBase)

或者Django's generic foreign key:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Task(models.Model):
    card = models.CharField(max_length=32)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

这些解决方案中的任何一个都允许您将多个模型附加到 Task,但我发现多态路由清理器可以使用。

【讨论】:

  • 抱歉不清楚,这些模型有 'SalesforceModel' 而不是 'models.Model',所以“元类冲突:派生类的元类必须是元类的(非严格)子类的所有基础”。我也无法为 GenericForeignKey 添加任何字段。
  • 我尝试将 PolymorphicModelBase 和 SalesforceModelBase 结合起来,它对 ContactBase 表的查询不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2011-07-02
  • 2020-01-26
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多