【问题标题】:Creating ManyToMany instances at the same time in Django在 Django 中同时创建 ManyToMany 实例
【发布时间】:2019-03-31 11:59:54
【问题描述】:

我有一个 json 格式的所有国家/地区的数据,如下所示:

{
      "name":"Afghanistan",
      "topLevelDomain":[
         ".af"
      ],
      "alpha2Code":"AF",
      "alpha3Code":"AFG",
      "callingCodes":[
         "93"
      ],
      "capital":"Kabul",
      "altSpellings":[
         "AF",
         "Afġānistān"
      ],
      "region":"Asia",
      "subregion":"Southern Asia",
      "population":27657145,
      "latlng":[
         33.0,
         65.0
      ],
      "demonym":"Afghan",
      "area":652230.0,
      "gini":27.8,
      "timezones":[
         "UTC+04:30"
      ],
      "borders":[
         "IRN",
         "PAK",
         "TKM",
         "UZB",
         "TJK",
         "CHN"
      ],
      "nativeName":"افغانستان",
      "numericCode":"004",
      "currencies":[
         {
            "code":"AFN",
            "name":"Afghan afghani",
            "symbol":"؋"
         }
      ],
      "languages":[
         {
            "iso639_1":"ps",
            "iso639_2":"pus",
            "name":"Pashto",
            "nativeName":"پښتو"
         },
         {
            "iso639_1":"uz",
            "iso639_2":"uzb",
            "name":"Uzbek",
            "nativeName":"Oʻzbek"
         },
         {
            "iso639_1":"tk",
            "iso639_2":"tuk",
            "name":"Turkmen",
            "nativeName":"Türkmen"
         }
      ],
      "translations":{
         "de":"Afghanistan",
         "es":"Afganistán",
         "fr":"Afghanistan",
         "ja":"アフガニスタン",
         "it":"Afghanistan",
         "br":"Afeganistão",
         "pt":"Afeganistão",
         "nl":"Afghanistan",
         "hr":"Afganistan",
         "fa":"افغانستان"
      },
      "regionalBlocs":[
         {
            "acronym":"SAARC",
            "name":"South Asian Association for Regional Cooperation",
            "otherAcronyms":[

            ],
            "otherNames":[

            ]
         }
      ],
      "cioc":"AFG"
   }

我正在尝试制作模型来代表所有这些信息。我有一个 Country 模型,然后是一个通过 ManyToManyField() 链接到 Country 的语言、翻译、区域块和货币模型。我正在尝试使用 Django shell 一次将所有国家/地区添加到我的数据库中。在里面我正在运行这个命令:

import json
from api.models import Country
from api.models import currencies, languages, translations, regionalBlocs
with open('data.json') as f:
  data_json = json.load(f)

for data in data_json:
    data = Country(name=data['name'], topLevelDomain=data['topLevelDomain'], callingCodes=data['callingCodes'], capital=data['capital'], altSpellings=data['altSpellings'], region=data['region'], subregion=data['subregion'], population=data['population'],latlng=data['latlng'], demonym=data['demonym'], area=['area'], gini=data['gini'], timezones=data['timezones'], borders=data['borders'], nativeName=data['nativeName'], numericCode=data['numericCode'], currencies=data['currencies'], languages=data['languages'], translations=data['translations'], flag=data['flag'], regionalBlocs=data['regionalBlocs'], cioc=data['cioc'])
    data.save()

但我收到错误“禁止直接分配到多对多集合的前端。请改用currency.set()。”

在将国家/地区实例设置到数据库中时,是否可以设置这 4 个多对多实例?我只有一个包含所有国家/地区的 JSON 文件,因此在创建国家/地区实例之前分离出每种货币、语言等需要大量工作。

models.py:

class languages(models.Model):
    iso639_1 = models.CharField(max_length=255, null=True)
    iso639_2 = models.CharField(max_length=255, null=True)
    name = models.CharField(max_length=255, null=True)
    nativeName = models.CharField(max_length=255, null=True)


class Country(models.Model):
    languages = models.ManyToManyField(languages)

【问题讨论】:

    标签: python json django django-rest-framework


    【解决方案1】:

    不,你不能。

    ManyToManyField 基本上是一个表,其中包含来自两个对象的两个主键。当两端都没有引用时,很难添加任何关系。因此,ManyToManyField 需要先有一个真实对象作为参考。

    【讨论】:

    • 如果我先将所有语言放入我的数据库中,然后按原样加载 json 文件,在我的 data= 调用中连接语言 ManyToMany 字段的命令是什么?
    • 如果你不显示models.py,我无法确定任何事情。
    • 好的!我包括了相关部分。所有这些 m2m 都是一样的,所有其他属性都是 charfields
    • 当数据是 Country 对象和 en/es/fr 是 languages 对象时,您可以执行类似 data.languages.add(en)data.languages.add(en, es, fr) 的操作
    • 我不得不说 en =languages.objects,filter(name='english')?并且 .add() 必须在我的国家对象上的 .save() 之后运行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2019-01-06
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多