Python 使用ForeignKey字段测试和创建对象

Python 使用ForeignKey字段测试和创建对象,python,django,Python,Django,我正在尝试编写一些单元测试,并为此创建了一些虚拟对象。我有一个型号扬声器,部分外观如下: class speaker(models.Model): name = models.CharField(max_length=255) email = models.CharField(max_length=255, primary_key=True) ... 还有一个类talk,部分看起来像这样: class talk(models.Model): title = mo

我正在尝试编写一些单元测试,并为此创建了一些虚拟对象。我有一个型号
扬声器
,部分外观如下:

class speaker(models.Model):
    name = models.CharField(max_length=255)
    email = models.CharField(max_length=255, primary_key=True)
    ...
还有一个类
talk
,部分看起来像这样:

class talk(models.Model):
    title = models.CharField(max_length = 255) 
    ...
    speakers = models.ManyToManyField('speaker') 
    ...
class TalkTest(TestCase):
    def setUp(self):

        speaker.objects.create(
            name = "John Smith",
            email = "john@john.com"
            )

        talk.objects.create(
            title = "Writing unit tests",
            summary = "How to write unit tests",
            speakers = "john@john.com"
            )

    def test_talk_URLs(self):
        testSpeak = speaker.objects.get(name="John Smith")
        testTalk = talk.objects.get(title="Writing unit tests")

        self.assertEqual(testSpeak.email, "john@john.com")
我的测试设置如下所示:

class talk(models.Model):
    title = models.CharField(max_length = 255) 
    ...
    speakers = models.ManyToManyField('speaker') 
    ...
class TalkTest(TestCase):
    def setUp(self):

        speaker.objects.create(
            name = "John Smith",
            email = "john@john.com"
            )

        talk.objects.create(
            title = "Writing unit tests",
            summary = "How to write unit tests",
            speakers = "john@john.com"
            )

    def test_talk_URLs(self):
        testSpeak = speaker.objects.get(name="John Smith")
        testTalk = talk.objects.get(title="Writing unit tests")

        self.assertEqual(testSpeak.email, "john@john.com")
但是,我得到了以下回溯错误

======================================================================
ERROR: test_talk_URLs (core.tests.TalkTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/rony/Documents/rehab-lightning-talks/core/tests.py", line 43, in setUp
speakers = "1"
File "/home/rony/Documents/rehab-lightning-talks/venv/local/lib/python2.7/site-packages/django/db/models/manager.py", line 149, in create
return self.get_query_set().create(**kwargs)
File "/home/rony/Documents/rehab-lightning-talks/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 414, in create
obj = self.model(**kwargs)
File "/home/rony/Documents/rehab-lightning-talks/venv/local/lib/python2.7/site-packages/django/db/models/base.py", line 415, in __init__
raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0])
TypeError: 'speakers' is an invalid keyword argument for this function

----------------------------------------------------------------------

我没有正确引用外键吗?

这是一个关于很多字段的问题,而不是外键

对于M2M,您不能将其作为
create
的一部分来执行-您需要在之后对其进行设置(因为M2M关系实际上是第三个链接表中的记录,所以您需要原始模型的PK,只有在创建后才能获得该PK)

我还应该注意,这不是一个好的单元测试。Django自己的测试很好地测试了模型实例创建和保存的机制。单元测试应该测试您的实际逻辑