我需要查询一组主键包含在列表中的对象

时间:2014-05-10 22:08:46

标签: python django

正如标题所说,我需要一种方法来执行此查询。我尝试过以下方法:

user_list_ids = []
user_lists = []

user_entries = OwnerEntry.objects.filter(name=request.user)

for user in user_entries:
    user_list_ids.append(user.list_id)

user_lists = ListEntry.objects.filter(id__in=user_list_ids)

for user in user_entries:
        user_list_ids.append(user.list_id)

user_lists = ListEntry.objects.filter(id__in=user_list_ids)

但是,我在最后一行收到错误:int()参数必须是字符串或数字,而不是' ListEntry'

以下是相关模型:

class OwnerEntry(models.Model):
    name = models.CharField(max_length=32)
    list_id = models.ForeignKey(ListEntry)

    class Meta:
        ordering = ('name',)

class ListEntry(models.Model):
    name = models.CharField(max_length=64)
    # active_date = models.DateTimeField('date of last list activity')
    expire_date = models.DateField('date of expiration')
    create_date = models.DateField('date created')

2 个答案:

答案 0 :(得分:2)

直接回答您的问题,请注意您有一个list_id而不是list作为ForeignKey名称(OwnerEntry型号)。为了实际提取fk值,您应该使用list_id_id代替(或将list_id重命名为list;))

请注意,django支持对象引用,如下所示:

someowner = OwnerEntry.objects.get( ... ) ownerslist = someowner.listentry_set.all()

喝彩!

答案 1 :(得分:0)

您可以将OwnerEntry的外键定义为ListEntry:

list_id = models.ForeignKey(ListEntry, related_query_name='owner_entry')

然后在你的代码中执行此单行程序:

user_lists = ListEntry.objects.filter(owner_entry__name=request.user)

这样做恰好过滤每个ListEntry,它至少有一个owner_entry,其名称等于request.user's。 重新定义外键只是为了给查询属性一个好名字。

有关使用向后关系的查询的更多详细信息:https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships