我正在使用Django v1.9.4和PostgreSQL 9.2.14.使用以下型号:
from django.db import models
from django.contrib.contenttypes.fields import GenericRelation, GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Foo(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
bar = GenericForeignKey('content_type', 'object_id')
class Bar(models.Model):
foos = GenericRelation(Foo, related_query_name='bars')
class Meta:
abstract = True
class BarX(Bar):
name = models.CharField(max_length=10, default='bar x')
class BarY(Bar):
name = models.CharField(max_length=10, default='bar y')
Run Code Online (Sandbox Code Playgroud)
创建一些实例来演示我的问题:
>>> bar_x = BarX.objects.create()
>>> bar_y = BarY.objects.create()
>>> foo1 = Foo.objects.create(bar=bar_x)
>>> foo2 = Foo.objects.create(bar=bar_y)
>>> foo1.bar.name
u'bar x'
>>> foo2.bar.name
u'bar y'
Run Code Online (Sandbox Code Playgroud)
我无法遍历django中的GFK,尝试过滤引发异常,并显示一条消息,建议添加GenericRelation …
python django postgresql generic-relations generic-foreign-key
我有一个通用关系指向各种其他对象的对象,我需要它们合并(内联),因此序列化对象看起来像一个完整的对象.
例如:
class Enrollement(models.Model):
hq = models.ForeignKey(Hq)
enrollement_date = models.Datetime()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
class Nurse(models.Model):
hospital = models.ForeignKey(Hospital)
enrollement = GenericRelation(Enrollement)
class Pilot(models.Model):
plane = models.ForeignKey(plane)
enrollement = GenericRelation(Enrollement)
Run Code Online (Sandbox Code Playgroud)
序列化时,我想得到这样的东西:
{
count: 50,
next: 'http...',
previous: null,
results: [
{
type: "nurse",
hq: 'http://url/to/hq-detail/view',
enrollement_date: '2003-01-01 01:01:01',
hospital: 'http://url/to/hospital-detail/view'
},
{
type: "pilot",
hq: 'http://url/to/hq-detail/view',
enrollement_date: '2003-01-01 01:01:01',
plante: 'http://url/to/plane-detail/view'
},
]
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做,如果可以,怎么做?
我可以嵌套一个通用关系,我可以发布处理serilizer.data以获得我想要的东西,但我想知道是否有更好的方法.
django rest serialization generic-relations django-rest-framework
我有以下概念模型:
class GenericAbstractBase(models.Model):
name = models.CharField(max_length=255)
staff = generic.GenericRelation(
"Staff",
content_type_field="content_type",
object_id_field="object_id",
)
class Meta:
abstract = True
class GenericModelA(GenericAbstractBase):
extra_a = models.CharField(max_length=255)
class GenericModelB(GenericAbstractBase):
extra_b = models.CharField(max_lenth=10)
class Staff(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
active = models.CharField(max_length=10, choices = ACTIVE_CHOICES)
limit = models.Q(app_label='staff', model='genericmodela') | models.Q(app_label='staff', model='genericmodelb')
content_type = models.ForeignKey(ContentType, limit_choices_to=limit)
object_id = models.PositiveIntegerField()
generic_object = generic.GenericForeignKey("content_type", "object_id")
Run Code Online (Sandbox Code Playgroud)
在Django v1.4和Django v1.5中,以下查询工作正常:
>>> ctype = ContentType.objects.get_for_model(GenericModelA)
>>> Staff.objects.filter(
content_type=ctype,
genericmodela__name__icontains="a"
)
>>> [<Staff: Abbott, Kaylee>, <Staff: Adams, Kay>, ... …Run Code Online (Sandbox Code Playgroud) 我有mixin和型号:
class Mixin(object):
field = GenericRelation('ModelWithGR')
class MyModel(Mixin, models.Model):
...
Run Code Online (Sandbox Code Playgroud)
但是django不会把GenericRelation场变成GenericRelatedObjectManager:
>>> m = MyModel()
>>> m.field
<django.contrib.contenttypes.fields.GenericRelation>
Run Code Online (Sandbox Code Playgroud)
当我将字段放入模型本身或抽象模型时 - 它工作正常:
class MyModel(Mixin, models.Model):
field = GenericRelation('ModelWithGR')
>>> m = MyModel()
>>> m.field
<django.contrib.contenttypes.fields.GenericRelatedObjectManager at 0x3bf47d0>
Run Code Online (Sandbox Code Playgroud)
我怎样才能GenericRelation在mixin中使用?
我有一个具有多个通用关系的模型,在我的模板中使用它变得非常复杂.该模型是一个'演出'或音乐活动,发生在'Venue'和/或'Festival',并有一个'Musician'和/或'Ensemble'.
复杂的地方是每个'Gig'都有一个演示者,推广者和代理人.这些设置为与其他模型(如"PresenterCompany")的通用关系.演示者公司可以是推广者,演示者或代理人,或者是同一个演出者的所有人.以下是模型(简化为参考):
class Gig(models.Model):
description = models.CharField(max_length=100, blank=True)
date = models.DateTimeField()
venue = models.ForeignKey(Venue)
festival = models.ForeignKey(Festival, blank = True, null=True)
musician = models.ManyToManyField(Musician, blank=True)
ensembles = models.ManyToManyField(Ensemble, blank = True)
presenter_content_type = models.ForeignKey(ContentType,
limit_choices_to={"model__in": ("Individual", "ArtsOrganization",'Presenter', "BookingAgent","Festival", "OtherOrganization","PresenterCompany", "Venue")}, related_name = "Presenter Type", verbose_name = "Presenter",blank=True, null=True)
presenter_id = models.IntegerField(db_index=True, blank=True, null=True, verbose_name='Presenter ID')
presenter = generic.GenericForeignKey('presenter_content_type','presenter_id')
promoter_content_type = models.ForeignKey(ContentType,
limit_choices_to={"model__in": ("Individual", "ArtsOrganization","BookingAgent","Presenter", "Festival", "OtherOrganization","PresenterCompany", "Venue")}, related_name = "promotor", verbose_name='Promoter Type', blank=True, null=True)
promoter_id = models.IntegerField(db_index=True, blank=True, null=True, verbose_name='Promoter …Run Code Online (Sandbox Code Playgroud) 我得到了一个模型TrackedItem,其通用关系链接到它应该跟踪的任何模型.
如果我这样做:
t = TrackedItem(content_object=MyModel)
t.save()
t.save()
Run Code Online (Sandbox Code Playgroud)
我明白了:
IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")
Run Code Online (Sandbox Code Playgroud)
实际上,第一次保存创建了一个以"1"作为PK的条目.但是第二次保存不应该插入,它应该更新.
我怎么想更新模型我不能保存两次?
使用普通型号,我可以尽可能多地保存.
编辑:它可能与通用关系完全无关.
我有一个超越的保存,我用这种方式称之为超级:
super(TrackedItem, self).save(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
如果我这样做,它的工作原理:
model.Model.save(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)