Модели фильтров на основе типа контента django 1.7
Мой 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')
Я хочу получить список идентификаторов "OneTimeEvent" из модели "Событие".
В оболочке Python, когда я делаю что-то вроде
>>> 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 с ContentType в Django, я пробовал то же самое, но с этим решением я получаю пустой список
>>> Event.objects.filter(content_type__model = 'OneTimeEvent')
[]
Что я должен делать. заранее спасибо
1 ответ
Решение
content_type
является внешним ключом модели ContentType. Эта модель имеет различные методы управления, среди которых get_for_model
, который принимает класс модели (примечание, а не строку) и возвращает соответствующий объект ContentType. Так:
ct = ContentType.objects.get_for_model(OneTimeEvent)
Event.objects.filter(content_type=ct)