标签: generic-relations

如何遍历Django中的GenericForeignKey?

我正在使用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

11
推荐指数
1
解决办法
6061
查看次数

如何编写一个django-rest-framework序列化器/字段来合并来自泛型关系的数据?

我有一个通用关系指向各种其他对象的对象,我需要它们合并(内联),因此序列化对象看起来像一个完整的对象.

例如:

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

10
推荐指数
1
解决办法
7918
查看次数

Django通用外键过滤(v1.5和v1.6之间的区别)

我有以下概念模型:

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)

django generic-relations generic-foreign-key

7
推荐指数
1
解决办法
1363
查看次数

模型Mixin中的Django GenericRelation

我有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中使用?

django generic-relations

7
推荐指数
1
解决办法
633
查看次数

Django:一个模型中的多个通用关系设计不好吗?

我有一个具有多个通用关系的模型,在我的模板中使用它变得非常复杂.该模型是一个'演出'或音乐活动,发生在'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)

django models generic-relations

6
推荐指数
1
解决办法
610
查看次数

为什么我不能在Django中使用两次通用关系保存我的模型?

我得到了一个模型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)

django save generic-relations

2
推荐指数
1
解决办法
413
查看次数