不能通过值在Django ManyToManyField中使用字符串

时间:2016-06-21 18:43:32

标签: python django django-models

(道歉,如果我错过了一些关键信息来帮助诊断这一点 - 我是Python和Django的新手。)

当我尝试在ManyToManyField中通过属性使用字符串时,Django抱怨:

File "/vagrant/flamingo_env/lib/python3.4/site-packages/django/db/models/fields/related.py", line 1366, in _check_relationship_model
  for f in through._meta.fields:
AttributeError: 'str' object has no attribute '_meta'

用法:

class Voter(models.Model):
  # ...
  addresses = models.ManyToManyField(Address, through='voter_addresses', through_fields=('voter_id', 'address_id'))

如果我创建一个Through模型,错误就会消失:

class VoterAddress(models.Model):
  voter_id = models.ForeignKey(Voter)
  address_id = models.ForeignKey(Address)

  class Meta:
    db_table = 'voter_addresses'

但当然,它抱怨Voter还没有被定义 - 我不能简单地改变顺序,否则VoterAddress也不会被定义。

在每个例子中,我都看到了使用的基本字符串版本。发生了什么事?

2 个答案:

答案 0 :(得分:2)

您需要修改传递给using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace MyApp { class MyClass { public MyClass() { var MyProcess = System.Diagnostics.Process.GetProcesses().FirstOrDefault(f => f.ProcessName == "MyProcess"); } } }

的名称
through

必须是自定义 addresses = models.ManyToManyField(Address, through='VoterAddress')

的确切名称

如果您未传递throughmodel参数,则无需创建throughmodel。 Django将为您创建和管理一个

答案 1 :(得分:0)

要解决您的订购问题,您可以为ForeignKey类提供字符串值。

class VoterAddress(models.Model):
    voter_id = models.ForeignKey("Voter")
    address_id = models.ForeignKey("Address")

    class Meta:
        db_table = 'voter_addresses'

这是一种将外键定义到尚未在文件中定义的模型的方法。 如果你改变了这个,Django不会抱怨Voter hasn't been defined