允许在特定条件下创建ForeignKey关系

问题描述 投票:0回答:1

我正在努力解决给定的情况。我有以下模型:

class Location(models.Model):

    COUNTRY = 1
    REGION = 2
    region_type_choices = ((COUNTRY, 'country'),
                           (REGION, 'region'))
    name = models.CharField(max_length=120, blank=False)
    country_code = models.CharField(max_length=10, blank=False)
    region = models.CharField(max_length=10, choices=region_type_choices)
    is_recommended = models.BooleanField(default=False)
    countries = models.ForeignKey('Location', related_name='related_countries', 
                                  on_delete=models.DO_NOTHING)

我在这里要实现的是:如果要添加的Region实例的区域属性设置为country,并且只能将新对象添加到countries关系中,并且基本实例设置为region

例如:

country = Location(name='test', region=1)
region = Location(name='test2', region=2)
region2 = Location(name='test3', region=2)
region.related_countries.add(country) <-- this is valid
country.related_countries.add(region) <-- this is invalid
region.related_countries.add(region2) <-- this is also invalid

在Django中使用单个表是否有可能实现?我已经尝试覆盖post_save并保存信号,但这似乎没有用。

我将不胜感激。

python django django-1.11
1个回答
0
投票

我认为您可以更轻松地将位置分为三个模型:

class Location(models.Model):
    name = models.CharField(max_length=120, blank=False)
    is_recommended = models.BooleanField(default=False)

    class Meta:
        abstract = True

class Country(Location):
    pass

class Region(Location):
    countries = models.ManyToManyField('Country', related_name='regions', blank=True)

country = Country(name='test')
region = Region(name='test2')
region2 = Region(name='test3')
country.regions.set([region, region2])
© www.soinside.com 2019 - 2024. All rights reserved.