【问题标题】:I want to use the django ORM to get a complement from two tables我想使用 django ORM 从两个表中获取补码
【发布时间】:2015-07-09 16:11:57
【问题描述】:

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

我有以下两张表:

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

【问题讨论】:

    标签: python django orm django-queryset set-theory


    【解决方案1】:

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

    【讨论】:

    • 还是不行 :(这是我的代码<br>PersonalRecord_set = PersonalRecord.objects.filter(book = current.book,id = i_d) </br>WordBase_set = WordBase.objects.filter(belong = current.book) </br>new_words = WordBase_set.exclude(number__in=[o.number for o in PersonalRecord_set])[:1]是不是我做错了什么?
    • 哦,您正在尝试计算两个不同模型(PersonalRecordWordBase)之间的补码。我的回答和链接的问题假设它们是同一模型的两组。不看你的模型很难判断,但我想排除应该仍然有效,因为你的集合中实际上有对象。尝试在 django shell 中手动运行查询,并确保两个集合中都有对象。
    • 查询是否产生错误,或者只是一个意外的集合? PersonalRecordWordBase 是否都有数字字段?
    • 它不会产生任何错误,PersonalRecord 和 WordBase 有 number 字段都有 number 字段。
    • 我能给出的最佳建议是简化您的查询并在 django shell 中运行以尝试了解正在发生的事情和原因。我发布的设置补码确实是正确的(我已经尝试过了),所以您的数据中可能缺少某些内容。您发布的查询将从WordBase_set 中过滤掉任何编号等于PersonalRecord_set 中任何对象的编号的对象。这是你想要的吗?
    猜你喜欢
    • 2020-06-14
    • 2015-12-11
    • 2021-02-26
    • 1970-01-01
    • 2018-12-22
    • 2017-07-04
    • 1970-01-01
    • 2020-12-27
    • 2019-07-26
    相关资源
    最近更新 更多