【问题标题】:Filter Models based on content type django 1.7基于内容类型的过滤模型 django 1.7
【发布时间】:2014-11-05 09:29:07
【问题描述】:

我的 models.py 看起来像

class OneTimeEvent(models.Model):
    title = models.CharField(max_length = 160)
    location = models.CharField(max_length = 200, blank = True)
    event_date = models.DateTimeField('event date',blank = True, null = True)
    price = models.IntegerField(max_length = 20, blank = True, null = True)
    seats = models.IntegerField(max_length = 20, blank = True, null = True)
    abstract = models.TextField()
    event_plan = models.TextField()
    available_seats = models.IntegerField(max_length = 20, blank = True, null = True)
    booked_seats = models.IntegerField(max_length = 20, blank = True, null = True)
    byt_url = models.CharField(max_length = 160, blank = True)
    tags = models.TextField()

class RecurringEvent(models.Model):
    title = models.CharField(max_length = 160)
    location = models.CharField(max_length = 200, blank = True)
    price = models.IntegerField(max_length = 10)

class Event(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    event_type = generic.GenericForeignKey('content_type', 'object_id')

我想从“Event”模型中获取“OneTimeEvent”的ID列表。

当我在 python shell 中做类似的事情时

>>> event = Event.objects.get(pk = 1)
>>> event.content_type
<ContentType: one time event>

从上面的代码我可以知道“主键是一次性事件的事件的内容类型”但是当我这样做时

>>> Event.objects.filter(content_type = "one time event")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 691, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 709, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1287, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1314, in _add_q
    current_negated=current_negated, connector=connector)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1181, in build_filter
    lookups, value)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 1545, in get_lookup_constraint
    lookup_class(Col(alias, target, source), val), AND)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/lookups.py", line 82, in __init__
    self.rhs = self.get_prep_lookup()
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/lookups.py", line 85, in get_prep_lookup
    return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 646, in get_prep_lookup
    return self.get_prep_value(value)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 915, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'one time event'
>>> 

我收到此错误。

之前Filter 2 models with ContentType in Django 提出了一个类似的问题,我尝试了同样的方法,但使用此解决方案我得到了空列表

>>> Event.objects.filter(content_type__model = 'OneTimeEvent')
[]

我该怎么办。 提前致谢

【问题讨论】:

    标签: django django-models django-1.7 django-contenttypes


    【解决方案1】:

    content_type 是 ContentType 模型的外键。该模型具有各种管理器方法,其中get_for_model 采用模型类(注意,不是字符串)并返回相关的 ContentType 对象。所以:

    ct = ContentType.objects.get_for_model(OneTimeEvent)
    Event.objects.filter(content_type=ct)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-01
      • 2016-11-22
      • 1970-01-01
      • 2011-04-04
      • 2021-11-03
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多