我想使用 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)
是根据先前创建的查询集计算此类列表的两种不同方式(显然,它们都访问数据库以构建列表)。
我已经检查过这个问题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)
是根据先前创建的查询集计算此类列表的两种不同方式(显然,它们都访问数据库以构建列表)。