0

我已经检查了这个问题 获取查询集的补充。但是,它没有用。似乎它只在结果中提取一个字段。

我有以下两个表:

表A

   001 a 
   002 b
   003 C

表 B

   001 a
   002 b
   003 c
   004 d
   005 e

我的目标是得到这样的补码:

补充

   004 d
   005 e

如何使用 ORM 得到这个结果?

模型

class WordBase(models.Model):
    number  = models.SlugField(primary_key=True)
    word    = models.CharField(max_length=128)
    belong  = models.CharField(max_length=128)
    mean    = models.TextField()
    example = models.TextField()
class PersonalRecord(models.Model):
    user = models.ForeignKey(User)
    book = models.CharField(max_length=128)
    number =  models.CharField(max_length=128)
    begtime= models.CharField(max_length=128)
    endtime = models.CharField(max_length=128,blank=True,)
    lasttime = models.CharField(max_length=128,blank=True,)
    times = models.IntegerField()
    status = models.IntegerField()
4

1 回答 1

0

您提供的链接中的答案应该是正确的。基本上你需要做的是从集合 B 中排除集合 A。

setA = MyModel.objects.filter(…)  # Query for items belonging in set A
setB = MyModel.objects.filter(…)  # Query for items belonging in set B

# setA and setB are QuerySets, ans as such does not query the database
# until the data is actually needed. Thus you can just add further
# delimitations. The below lines does the same thing, somewhat differently.

complement = setB.objects.exclude(pk__in=[o.id for o in setA])
complement = setB.objects.exclude(pk__in=setA.values_list('pk', flat=True))

如您所见,您需要做的是从 setB 中排除pk指定列表中的任何对象。[o.id for o in setA]并且setA.values_list('pk', flat=True)是从先前创建的查询集中计算此类列表的两种不同方法(显然,它们都访问数据库以构建列表)。

于 2015-04-30T05:37:47.353 回答