【问题标题】:Write test for a Django model with many-to-many relation为具有多对多关系的 Django 模型编写测试
【发布时间】:2018-02-09 12:59:04
【问题描述】:

我想为具有多对多关系的 Django 模型编写一个测试,但我收到了这个错误:

ValueError: "" 需要在字段 "id" 之前有一个值 可以使用这种多对多关系。

我的测试:

class ModelTestCase(TestCase):
    def setUp(self):
        self.mock_file = mock.MagicMock(File)
        self.mock_file.name = 'MockFile'
        self.before_count = Tour.objects.count()
        self.tour_agency = TourAgency.objects.create(
            name='agency',
            username='agency')
        self.tour_category = TourCategory.objects.create(name='category')
        self.tour_equipment = TourEquipment.objects.create(name='equipment')
        self.tour_leader = TourLeader.objects.create(
            name='leader',
            email='leader@sample.com',
            username='leader',
            bio='sample text',)
        self.tour_tag = TourTag.objects.create(name='tag')

    def test_model_can_create_tour(self):
        self.tour = Tour.objects.create(
            name='tour',
            description='description',
            summary='summary',
            agency=self.tour_agency,
            equipment=self.tour_equipment,
            category=self.tour_category,
            tags=self.tour_tag,
            activity_type='activity type',
            date=datetime.now,
            photo=self.mock_file)
        self.tour.save()
        self.tour.save_m2m()
        count = Tour.objects.count()
        self.assertNotEqual(self.before_count, count)

我会尝试使用.save() 保存对象,但它不起作用。

【问题讨论】:

    标签: python django testing django-models


    【解决方案1】:

    在添加多对多关系之前,您首先需要保存游览模型。查看代码我认为多对多是字段'tags'

    def test_model_can_create_tour(self):
        self.tour = Tour.objects.create(
            name='tour',
            description='description',
            summary='summary',
            agency=self.tour_agency,
            equipment=self.tour_equipment,
            category=self.tour_category,
            activity_type='activity type',
            date=datetime.now,
            photo=self.mock_file)
    
        # Adding the tour later.
        self.tour.tags.add(self.tour_tag)
        count = Tour.objects.count()
        self.assertNotEqual(self.before_count, count)
    

    这应该可以通过测试。

    【讨论】:

      【解决方案2】:

      给模型添加标签(m2m字段),先保存模型,再给模型添加标签

      self.tour.tags.add([tag names])
      

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 2014-05-16
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        相关资源
        最近更新 更多