下面有一个模型指向一般关系。这可以是联系对象或客户对象。
class Unsubscribe(models.Model):
"""
Notes:
See: http://www.screamingatmyscreen.com/2012/6/django-and-generic-relations/
"""
content_type = models.ForeignKey(ContentType, help_text="Represents the name of the model")
object_id = models.PositiveIntegerField(help_text="stores the object id")
content_object = generic.GenericForeignKey('content_type', 'object_id')
reason = models.CharField(max_length=60)
request_made = models.DateTimeField(auto_now_add=True,
help_text="Shows when object was created.")
class Meta:
ordering = ['-request_made']
我想列出所有未订阅的订阅客户和联系人仅供用户使用。
queryset = Unsubscribe.objects.filter()
上面给了我所有取消订阅的客户和联系人通常我会通过做....来解决这个问题....
queryset = Unsubscribe.objects.filter(user=request.user)
但是,Unsubscribe对象没有用户,但客户和联系人都有。
那么如何过滤通用关系呢?
答案 0 :(得分:2)
你可以试试这个
Unsubscribe.objects.filter(content_type__name='user', user=request.user)
对于content_type__name='user'
,为用户指定模型类的名称或与之关联的任何名称。
或者这也是
Unsubscribe.objects.filter(content_type__name='user', object_id=request.user.id)
答案 1 :(得分:2)
我认为你的模型就像:
class Contact(models.Model):
...
user = models.ForeignKey(User)
您可以使用以下方式获取与当前用户相关的所有联系人:
contact_ids = [each.id for each in request.user.contact_set.all()]
您可以获得该用户的所有未订阅联系人:
unsubscribed_contacts = Unsubscribe.objects.filter(content_type__name='contact', object_id__in=contact_ids)
答案 2 :(得分:2)
请记住,通用外键只是两个字段,一个是ContentType模型的ForeignKey,另一个是您指向的模型的主键。所以,为了更通用,你可以这样做:
content_type = ContentType.objects.get_for_model(User)
Unsubscribe.objects.filter(content_type=content_type, object_id=user.id)
答案 3 :(得分:0)
对于具有django较新版本的新问题,content_type__name
只是一个属性,您不能对此进行查询。而是像这样在您的过滤器方法中使用content_type__model
:
Unsubscribe.objects.filter(content_type__model='user', user=request.user)