如何在Django模型中使用“country”字段取决于“country”字段,而不创建表

时间:2016-10-01 12:25:56

标签: python django django-countries

我知道有几个问题就像这样(例如this one),但是没有问题可以帮助我解决问题。

我想在我的模型中有一个城市和一个国家/地区,城市的选择取决于国家;但我不想将城市和乡村定义为模型类。这是我的代码:

from django.contrib.auth.models import User
from django.db import models
from django.forms import ChoiceField
from django_countries.fields import CountryField


class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name="UserProfile")
    name = models.CharField(max_length=30, null=False, blank=False)
    picture = models.ImageField(upload_to='userProfiles/', null=False, blank=False)
    date_of_birth = models.DateTimeField(null=False, blank=False)
    country = CountryField()
    # city = ??
    national_code = models.IntegerField(max_length=10, null=False, blank=False)
    email = models.EmailField()

    def __str__(self):
        return '{}'.format(self.user.username)

    def __unicode__(self):
        return self.user.username

就像字段“country”country = CountryField()一样,我想知道是否有办法在不定义class Country(models.Model)class City(models.Model)

的情况下完成任务

3 个答案:

答案 0 :(得分:0)

唯一的方法是在模型中定义选择:

class UserProfile(models.Model):
    CITIES = (
        ('ny', 'New York'),
        ('sm', 'Santa Monica')
        # .. etc
    )
    city = models.CharField(max_length=5, choices=CITIES, blank=True)

more in the docs

答案 1 :(得分:0)

为此,您可以使用django-cities

但是,这不会解决输入逻辑的问题 - 如果您需要在选择表单中的国家/地区后过滤城市。您可以使用django-smart-selects,但我不确定实现django-cities的复杂模型结构是多么容易。

答案 2 :(得分:0)

我遇到了同样的问题,我使用 django-cities-light 来填充城市和地区/国家,而 django-smart-selects 用于过滤结果代码是这样的,并且在管理和表单中运行良好:

from django.db import models
from cities_light.models import City
from cities_light.models import Region
from smart_selects.db_fields import ChainedForeignKey

class Address(models.Model):
    ....
    state = models.ForeignKey(Region, on_delete=models.CASCADE)
    city = ChainedForeignKey(City, chained_field="state", chained_model_field="region")

记得在 INSTALLED_APPS 中添加 'cities_light' 和 'smart_selects'。 还要向网址添加“smart_selects”。

path('chaining/', include('smart_selects.urls')),