我最近更新到Django 1.9并尝试更新我的一些模型字段以使用内置的JSONField(我正在使用PostgreSQL 9.4.5).当我试图创建和更新我的对象的字段时,我遇到了一些特殊的东西.这是我的模型:
class Activity(models.Model):
activity_id = models.CharField(max_length=MAX_URL_LENGTH, db_index=True, unique=True)
my_data = JSONField(default=dict())
Run Code Online (Sandbox Code Playgroud)
这是我正在做的一个例子:
>>> from proj import models
>>> test, created = models.Activity.objects.get_or_create(activity_id="foo")
>>> created
True
>>> test.my_data['id'] = "foo"
>>> test.save()
>>> test
<Activity: {"id": "foo"}>
>>> test2, created2 = models.Activity.objects.get_or_create(activity_id="bar")
>>> created2
True
>>> test2
<Activity: {"id": "foo"}>
>>> test2.activity_id
'bar'
>>> test.activity_id
'foo'
Run Code Online (Sandbox Code Playgroud)
似乎每当我更新任何字段时my_data,我创建的下一个对象都会预先填充my_data来自前一个对象的数据.出现这种情况我是否使用get_or_create或只create.有人可以向我解释发生了什么吗?
我正在从 MySQL 后端切换到 PostgreSQL 后端,并且遇到了一些模型继承问题。以下是模型的示例:
class Parent(models.Model):
key = models.Charfield(...)
value = models.Charfield(...)
content_type = models.ForeignKey(ContentType)
object_id = models.CharField(max_length=200)
content_object = generic.GenericForeignKey('content_type', 'object_id')
class Child1(Parent):
pass
class Child2(Parent):
pass
Run Code Online (Sandbox Code Playgroud)
我们有两个这样的子类的原因是,我们正在另一个模型中模拟两个键/值对,并希望将它们分成两个表以便于查找。通用 FK 也用于将其附加到其他模型。这种继承设置在 MySQL 中运行良好,但是当我将其切换到 PostgreSQL 时,在尝试运行我们的测试时出现错误(但 syncdb 运行良好)。就好像 Django 对这种关系没问题,但 PostgreSQL 不喜欢生成的 SQL。当我查看从 syncdb 生成的内容时,我看到:
CREATE TABLE "myapp_parent" (
"id" serial NOT NULL PRIMARY KEY,
"key" varchar(200) NOT NULL,
"value" varchar(200) NOT NULL,
"content_type_id" integer NOT NULL REFERENCES "django_content_type" ("id") DEFERRABLE INITIALLY DEFERRED,
"object_id" varchar(200) NOT NULL);
CREATE TABLE "myapp_child1" …Run Code Online (Sandbox Code Playgroud) 假设我在 Django 中有以下模型:
class Parent(models.Model):
pass
class Child(models.Model):
parent = models.ForeignKey(Parent, related_name='children', null=True)
foo = models.CharField(max_length=5, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
我将如何查询Parent模型以查找所有Parent记录children的值为“ABC” foo?
如果我运行:
Parent.objects.filter(children__foo='ABC'),它会返回Parent至少其中一个对象children的值为 'ABC' 的对象foo,这不是我想要的。如有任何帮助,我们将不胜感激,谢谢。