我有一个具有一对多关系的FamilySession,因此实例family具有一个session_set。此外,Session具有session_number字段,该字段是整数。

我有两个Familyfamily1family2实例,因此,如果在session_set.order_by('session_number')调试器中打印出它们的ipdb,我会发现它们看起来完全一样:

ipdb> family1.session_set.order_by('session_number')
<QuerySet [<Session: Welcome>, <Session: First-Time Parents: The Basics of Birth>, <Session: Initial Postpartum Lactation>, <Session: Sleep Techniques for New Babies>, <Session: Breastfeeding Preparation>, <Session: Newborn Care Basics>, <Session: Easing the Transition Back to Work>, <Session: Preparing for Parenting>, <Session: Decoding Baby Cues>, <Session: Postpartum Doula Support>, <Session: First-Time Parents: Birth Prep Q&A>, <Session: Postpartum Lactation Follow-Up>, <Session: Sleep Training for 4 Months & Beyond>, <Session: Mental Wellness in Pregnancy>, <Session: Infant CPR>, <Session: Prenatal Pelvic Physical Therapy>, <Session: Prenatal Massage>]>
ipdb> family2.session_set.order_by('session_number')
<QuerySet [<Session: Welcome>, <Session: First-Time Parents: The Basics of Birth>, <Session: Initial Postpartum Lactation>, <Session: Sleep Techniques for New Babies>, <Session: Breastfeeding Preparation>, <Session: Newborn Care Basics>, <Session: Easing the Transition Back to Work>, <Session: Preparing for Parenting>, <Session: Decoding Baby Cues>, <Session: Postpartum Doula Support>, <Session: First-Time Parents: Birth Prep Q&A>, <Session: Postpartum Lactation Follow-Up>, <Session: Sleep Training for 4 Months & Beyond>, <Session: Mental Wellness in Pregnancy>, <Session: Infant CPR>, <Session: Prenatal Pelvic Physical Therapy>, <Session: Prenatal Massage>]>


但是,如果将这些查询集输入到assertQuerysetEqual中,则会导致测试失败:

ipdb> self.assertQuerysetEqual(family1.session_set.order_by('session_number'), family2.session_set.order_by('session_number'))
*** AssertionError: Lists differ: ['<Session: Welcome>', '<Session: First-Ti[642 chars]ge>'] != [<Session: Welcome>, <Session: First-Time [608 chars]age>]

First differing element 0:
'<Session: Welcome>'
<Session: Welcome>

Diff is 2186 characters long. Set self.maxDiff to None to see it.


这是将maxDiff设置为None的更详细的比较:

ipdb> self.maxDiff = None
ipdb> self.assertQuerysetEqual(family1.session_set.order_by('session_number'), family2.session_set.order_by('session_number'))
*** AssertionError: Lists differ: ['<Session: Welcome>', '<Session: First-Ti[642 chars]ge>'] != [<Session: Welcome>, <Session: First-Time [608 chars]age>]

First differing element 0:
'<Session: Welcome>'
<Session: Welcome>

- ['<Session: Welcome>',
?  -                  -

+ [<Session: Welcome>,
-  '<Session: First-Time Parents: The Basics of Birth>',
?  -                                                  -

+  <Session: First-Time Parents: The Basics of Birth>,
-  '<Session: Initial Postpartum Lactation>',
?  -                                       -

+  <Session: Initial Postpartum Lactation>,
-  '<Session: Sleep Techniques for New Babies>',
?  -                                          -

+  <Session: Sleep Techniques for New Babies>,
-  '<Session: Breastfeeding Preparation>',
?  -                                    -

+  <Session: Breastfeeding Preparation>,
-  '<Session: Newborn Care Basics>',
?  -                              -

+  <Session: Newborn Care Basics>,
-  '<Session: Easing the Transition Back to Work>',
?  -                                             -

+  <Session: Easing the Transition Back to Work>,
-  '<Session: Preparing for Parenting>',
?  -                                  -

+  <Session: Preparing for Parenting>,
-  '<Session: Decoding Baby Cues>',
?  -                             -

+  <Session: Decoding Baby Cues>,
-  '<Session: Postpartum Doula Support>',
?  -                                   -

+  <Session: Postpartum Doula Support>,
-  '<Session: First-Time Parents: Birth Prep Q&A>',
?  -                                             -

+  <Session: First-Time Parents: Birth Prep Q&A>,
-  '<Session: Postpartum Lactation Follow-Up>',
?  -                                         -

+  <Session: Postpartum Lactation Follow-Up>,
-  '<Session: Sleep Training for 4 Months & Beyond>',
?  -                                               -

+  <Session: Sleep Training for 4 Months & Beyond>,
-  '<Session: Mental Wellness in Pregnancy>',
?  -                                       -

+  <Session: Mental Wellness in Pregnancy>,
-  '<Session: Infant CPR>',
?  -                     -

+  <Session: Infant CPR>,
-  '<Session: Prenatal Pelvic Physical Therapy>',
?  -                                           -

+  <Session: Prenatal Pelvic Physical Therapy>,
-  '<Session: Prenatal Massage>']
?  -                           -

+  <Session: Prenatal Massage>]


似乎比较“不同步”。但是,session_number也相同:

ipdb> [(session.session_number, str(session.session_type)) for session in family1.session_set.order_by('session_number')]
[(0, 'Welcome'), (1, 'First-Time Parents: The Basics of Birth'), (2, 'Initial Postpartum Lactation'), (3, 'Sleep Techniques for New Babies'), (4, 'Breastfeeding Preparation'), (5, 'Newborn Care Basics'), (6, 'Easing the Transition Back to Work'), (7, 'Preparing for Parenting'), (8, 'Decoding Baby Cues'), (9, 'Postpartum Doula Support'), (10, 'First-Time Parents: Birth Prep Q&A'), (11, 'Postpartum Lactation Follow-Up'), (12, 'Sleep Training for 4 Months & Beyond'), (13, 'Mental Wellness in Pregnancy'), (14, 'Infant CPR'), (15, 'Prenatal Pelvic Physical Therapy'), (16, 'Prenatal Massage')]
ipdb> [(session.session_number, str(session.session_type)) for session in family2.session_set.order_by('session_number')]
[(0, 'Welcome'), (1, 'First-Time Parents: The Basics of Birth'), (2, 'Initial Postpartum Lactation'), (3, 'Sleep Techniques for New Babies'), (4, 'Breastfeeding Preparation'), (5, 'Newborn Care Basics'), (6, 'Easing the Transition Back to Work'), (7, 'Preparing for Parenting'), (8, 'Decoding Baby Cues'), (9, 'Postpartum Doula Support'), (10, 'First-Time Parents: Birth Prep Q&A'), (11, 'Postpartum Lactation Follow-Up'), (12, 'Sleep Training for 4 Months & Beyond'), (13, 'Mental Wellness in Pregnancy'), (14, 'Infant CPR'), (15, 'Prenatal Pelvic Physical Therapy'), (16, 'Prenatal Massage')]


为什么assertQuerysetEqual在这里不能按预期工作?

最佳答案

这是因为assertQuerysetEqual不会将查询集与另一个查询集进行比较,而是将查询集与值列表进行比较。

assertQuerysetEqual's documentation


  TransactionTestCase.assertQuerysetEqual(qs,values,transform = repr,ordered = True,msg = None)
  
  断言queryset qs返回一个
  值values的特定列表。
  
  qsvalues的内容比较使用
  功能变换默认情况下,这意味着每个的repr()
  比较值。


因此,您应该将第二个参数强制转换为列表:

self.assertQuerysetEqual(family1.session_set.order_by('session_number'), list(family2.session_set.order_by('session_number')))

10-06 07:09