【发布时间】:2019-02-19 12:53:22
【问题描述】:
我正在创建一个用于测试 Django 中的辅助函数的测试。运行测试时,我收到错误“重复的列名称 ID”
我尝试运行python3 manage.py migrate --fake-initial,在 Stackoverflow 上看到了一个解决方案,说明它可以工作,但它没有。
Test.py:
from django.test import TestCase
from reservations.models import Reservation, Table, Restaurant
from employee.helpers import *
class GetTablesWithCapacityTestCase(TestCase):
def setUp(self):
Restaurant.objects.create(
name="Test Restaurant",
description="Restaurant for use in test",
opening_time=12,
closing_time=24,
)
Table.objects.create(
restaurant=Restaurant.objects.filter(name="Test Restaurant"),
number_of_seats=5,
is_occupied=0
)
Table.objects.create(
restaurant=Restaurant.objects.filter(name="Test Restaurant"),
number_of_seats=4,
is_occupied=0
)
def test_get_tables(self):
tables = get_tables_with_capacity(5)
self.assertEqual(1, tables.size)
Models.py:
from django.db import models
from guest.models import Guest
from django.utils import timezone
class Restaurant(models.Model):
name = models.CharField(max_length=250)
description = models.CharField(max_length=250)
opening_time = models.TimeField()
closing_time = models.TimeField()
def __str__(self):
return self.name
class Table(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, null=True, blank=True)
number_of_seats = models.IntegerField()
is_occupied = models.BooleanField()
def __str__(self):
return str(self.id)
class Reservation(models.Model):
guest = models.ForeignKey(Guest, on_delete=models.CASCADE)
number_of_people = models.IntegerField(default=0)
start_date_time = models.DateTimeField(default=timezone.now)
end_date_time = models.DateTimeField(default=timezone.now)
created_date = models.DateTimeField(default=timezone.now)
table = models.ForeignKey(Table, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return self.start_date_time
编辑 2: Guest.models:
class Guest(models.Model):
email = models.EmailField()
reminder = models.BooleanField()
def __str__(self):
return self.email
我运行测试时得到的结果是:
MySQLdb._exceptions.OperationalError: (1060, "Duplicate column name 'table_id'")
The above exception was the direct cause of the following exception:
django.db.utils.OperationalError: (1060, "Duplicate column name 'table_id'")
哦,是的,我使用的是 MySQL,而不是内置的 Django SQLite。
我显然希望输出是失败的测试或成功的测试。
希望有人能帮忙!
【问题讨论】:
-
你能显示完整的堆栈跟踪吗?
-
@mfrackowiak 我已经编辑了原始帖子以包含完整的堆栈跟踪!
-
不要使用查询集
restaurant=Restaurant.objects.filter(name="Test Restaurant")分配外键,而是使用实际的餐厅对象(将filter替换为get或添加.first()以选择第一个对象)。跨度> -
包括
Guest模型的定义和迁移,因为在显示的模型中似乎没有任何重复。 -
堆栈跟踪似乎表明这是在测试数据库设置期间发生的。你能创建一个没有
setUp()方法的非常简单的TestCase和一个只有self.assertTrue(1 == 1)的虚拟测试,看看它是否有效?
标签: python mysql django testing