Django, Python

Phân biệt Union, Intersection and Difference trong phương thức trả về QuerySet

Bảng MyModel= { 1: ‘A’, 2: ‘B’, 3: ‘C’, 4: ‘D’, 1: ‘E’}

Thực hiện truy vấn lấy dữ liệu:

q1 = MyModel.objects.all() -> <QuerySet [<MyModel: A>, <MyModel: B>, <MyModel: C>, <MyModel: D>, <MyModel: E>]>
q2 = MyModel.objects.filter(name__in=('A','B')) -> <QuerySet [<MyModel: A>, <MyModel: B>]>
q3 = MyModel.objects.filter(name__in=('C','D')) -> <QuerySet [<MyModel: C>, <MyModel: D>]>

– Union() sẽ trả kết hợp các kết quả trong 2 hay nhiều QuerySet, theo mặc định các kết quả trả về là duy nhất, nếu muốn có các kết quả trùng lặp cần thêm all=True

q2.union(q3) -> <QuerySet [<MyModel: A>, <MyModel: B>, <MyModel: C>, <MyModel: D>]>

q1.union(q2, q3) -> <QuerySet [<MyModel: A>, <MyModel: B>, <MyModel: C>, <MyModel: D>, <MyModel: E>]>

q1.union(q3, all=True) -> <QuerySet [<MyModel: A>, <MyModel: B>, <MyModel: C>, <MyModel: D>, <MyModel: E><MyModel: C>, <MyModel: D>]>

– Intersection() sẽ trả các phần tử được chia sẻ trong 2 hay nhiều QuerySet,

q1.intersection(q2) -> <QuerySet [<MyModel: A>, <MyModel: B>]>

q2.intersection(q3) -> <QuerySet [ ]>

– Difference() trả về các phần tử có trong QuerySet này mà không có trong QuerySet khác.

q1.difference(q2) -> <QuerySet [<MyModel: C>, <MyModel: D>, <MyModel: E>]>

q1.difference(q2, q3) -> <QuerySet [<MyModel: E>]>

q2.difference(q3) -> <QuerySet [<MyModel: A>, <MyModel: B>]>