繁体   English   中英

直接在Django中获取并设置ForeignKey

Get and set ForeignKey directly in Django

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试使用从具有复合外键的mysql数据库创建的Django模型。

我的models.py像这样。

class Make(models.Model):
    idmake = models.IntegerField(primary_key=True)
    make = models.CharField(max_length=20L, unique=True, blank=True)
    def __unicode__(self):
      return self.make    
    class Meta:
        db_table = 'make'

class Models(models.Model):
    idmodels = models.IntegerField(primary_key=True, unique=True)
    make = models.ForeignKey(Make, db_column='make', to_field='make')
    model = models.CharField(max_length=45L, unique=True)
    resource_type = models.CharField(max_length=7L)
    def __unicode__(self):
      return self.model    
    class Meta:
        db_table = 'models'

class Systems(models.Model):
    idsystems = models.IntegerField(primary_key=True,  unique=True)
    make = models.ForeignKey(Models, null=True, db_column='make', blank=True, related_name='system_make')
    model = models.ForeignKey(Models, null=True, db_column='model', to_field = 'model', blank=True, related_name='system_model')
    serial_num = models.CharField(max_length=45L, blank=True)
    service_tag = models.CharField(max_length=45L, blank=True)
    mac = models.CharField(max_length=45L, unique=True)

现在,当我尝试访问Systems的make字段时,出现ValueError

>>> s = Systems.objects.get(pk=1)
>>> s.model
<Models: model11>
>>> s.model.make
<Make: make1>
>>> s.make
    Traceback (most recent call last):
    File "<console>", line 1, in <module>
    File "/usr/lib/python2.7/site-packages/django/db/models/fields/related.py", line 384, in __get__
      rel_obj = qs.get(**params)
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 395, in get
      clone = self.filter(*args, **kwargs)
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 669, in filter
      return self._filter_or_exclude(False, *args, **kwargs)
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 687, in _filter_or_exclude
      clone.query.add_q(Q(*args, **kwargs))
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1271, in add_q
      can_reuse=used_aliases, force_having=force_having)
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1202, in add_filter 
      connector)
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/where.py", line 71, in add 
      value = obj.prepare(lookup_type, value)
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/where.py", line 339, in prepare
      return self.field.get_prep_lookup(lookup_type, value)
    File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1003, in get_prep_lookup
      return super(IntegerField, self).get_prep_lookup(lookup_type, value)
    File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 322, in get_prep_lookup
      return self.get_prep_value(value)
    File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 997, in get_prep_value
      return int(value)
    ValueError: invalid literal for int() with base 10: 'make1'

我不允许更改数据库中的表和关系。 我是Django的新手,我无法找出解决此问题的正确方法。 基本上,我希望能够直接获取和设置Systems模型的make字段。 有人可以指导我如何去做吗? 我最初的想法是我必须创建一个自定义的ForeignKey字段。

2 个回复

我怀疑您的代码与您的数据库架构不匹配。 在这一行:

make = models.ForeignKey(Models, null=True, db_column='make', blank=True, related_name='system_make')

Models应该是Make ,不是吗? 而且您的Systems.model具有to_field = 'model' ,您是否错过了Systems.make to_field='make' 我建议您删除整个数据库,运行syncdb并再次创建测试数据。 然后查看错误是否仍然发生。

您的代码的更多提示:

  • 如您定义的to_field = 'model'to_field='make' ,您最好考虑为makemodel字段添加db_index=True 否则,当数据集很大时,查询性能可能会很差

  • 如果要将Make.makeModels.model设置为唯一并建立索引,则它们似乎已被视为主键。 在您的情况下,真的需要idmakeidmodels吗?

  • primary_key=True保证唯一。 unique=True多余的

  • Django转换使用单数形式定义模型。 即,使用Model System ,而不是Models Systems 另外,通常我们使用id而不是idmake idmodels 这些只是转换,由您决定

我发现了答案,而不是偶然。 愿意分享给面临类似问题的任何人。 直接从Systems访问make

>>> s = Systems.objects.get(pk=1)
>>> s.model
<Models: model11>
>>> s.model.make
<Make: make1>
>>> s.make_id
u'make1'

直接从Systems对象设置make

>>> s.make_id = Models.objects.get(model='model21').make.make
>>> s.save()
>>> s.make_id
u'make2'

被警告。 如果Models的get方法返回多个模型对象或不返回任何模型对象,则此方法将无效。 例如,如果我的Models表为:

在此处输入图片说明

然后

>>>> Models.objects.get(model='unknown').make.make
Traceback (most recent call last):
....
MultipleObjectsReturned: get() returned more than one Models -- it returned 2!
>>> Models.objects.get(model='not known').make.make
Traceback (most recent call last):
....
DoesNotExist: Models matching query does not exist.

我倒是程序员需要对这些事情保持谨慎。

编辑从@ZZY的评论到这个答案以及他自己的答案

class Models(models.Model):
    idmodels = models.IntegerField(primary_key=True, unique=True)
    make = models.ForeignKey(Make, db_column='make', to_field='make')
    model = models.CharField(max_length=45L, unique=True)
    resource_type = models.CharField(max_length=7L)
    def __unicode__(self):
      return self.model    
    class Meta:
        db_table = 'models'
        unique_together = ("make", "model")

而且还因为model在现场Models是独一无二的,应该不会出现在正确的表格由我描述的场景

2 直接在视图Django中设置字段外键值

我有一个名为 record 的模型,但它需要一个外键(条形码),我不想将它添加到带有选择的表单中(django 默认情况下这样做的方式),而不是我想手动插入它,所以我在forms.py 中做了这个 但我不知道如何将值传递给我的视图并将其添加到记录表中。 我收到错误“Record.barcode ...

5 如何直接在django块中修改li?

我的project.db已损坏。 我有一个由django_cms生成的导航菜单,我要做的就是修改导航栏中的li。 但是由于无法直接访问html,因此无法执行此操作。 如何修改django块的html? 这是我的代码: {% show_menu 0 1 100 100 "m ...

6 urls.py不能直接在Django中

我想在我的博客和视图类别中制作列表类别 这是view.py 这是urls.py 但我得到这样的错误 这是行错误: 那么,你能帮我找到这个问题的解决方案吗? ...

7 在Django模型中设置默认的ForeignKey

我需要在模型声明阶段(在models.py中)为模型设置默认外键。 我使用以下代码: 这可以正常工作,创建Choice实例和关联的Question实例。但是保存Choice实例会导致创建两个附加的(无用的)Question实例。 在Choice实例保存期间,似乎多次调用了defaul ...

10 如何在Django中获取ForeignKey的其他字段

我有两个模型作为作者和评论 一个是评论,它有一个ForeinKey指向作者(BlogUser) 作者模型 我正在尝试获取与指定文章相关的所有注释,并按用户名和注释bodys的格式显示注释列表。 在视图中,我按文章ID过滤所有评论,但在序列化过滤器查询集后,它只给出了作 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM