2014-11-05 120 views
1

我的models.py看起來像篩選模型的Django 1.7

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」的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') 
[] 

我應該怎麼做。 在此先感謝

回答

3

content_type是ContentType模型的外鍵。該模型有各種管理方法,其中包括get_for_model,它採用模型類(注意,不是字符串)並返回相關的ContentType對象。所以:

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