我想使用 django ORM 从两个表中获取补码

I want to use the django ORM to get a complement from two tables

我已经检查过这个问题Getting complement of queryset。但是,它没有用。结果好像只提取了一个字段。

我有以下两个table:

table一个

   001 a 
   002 b
   003 C

table 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()

您提供的 link 中的答案应该是正确的。基本上你需要做的是从集合 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) 是根据先前创建的查询集计算此类列表的两种不同方式(显然,它们都访问数据库以构建列表)。