【问题标题】:query chain of models in DjangoDjango中的模型查询链
【发布时间】:2019-03-22 12:04:48
【问题描述】:

我有国家、省、市的三种模型。其中一个 URL 包括帖子应该去的城市名称。我可以通过 URL 获得城市的名称。在视图功能中,我可以找到城市名称,然后我可以找到该城市所属的国家。现在,我想列出这个国家下的所有城市。我的问题是,在城市和国家之间没有直接关系的情况下,我该如何做到这一点。城市与省有关,省与国家有关。我想要的列表应该包括该国境内的所有城市,无论哪个省。我怎样才能做到这一点?除了在城市和乡村模型之间建立直接关系之外,还有什么可能的解决方案? 注意:我可以通过变量 post_city 获取国家 ID。所选城市的国家 ID 为 3。因此,我想要 ID 为 3 的国家下的所有城市。
示例:通过 URL:我将 post_city 变量设置为 Los Angeles。因此,无论加利福尼亚州如何,我都想要美国的所有城市。另一个例子,如果 post_city 变量是伦敦,那么,我想要英国的所有城市,而不考虑省份。 我拥有的模型如下:

class Country(models.Model):
    country_name = models.CharField(max_length=64, unique=True)

    def __str__(self):
        return "%s" % (self.country_name)


class Province(models.Model):
    country_id = models.ForeignKey(Country, on_delete=models.CASCADE)
    province_name = models.CharField(max_length=64)

    def __str__(self):
        return "%s" % (self.province_name)

class City(models.Model):
    province_name = models.ForeignKey(Province, on_delete=models.CASCADE)
    city_name = models.CharField(max_length=64)

    def Country(self):
        return self.province_name.country_id.country_name

查看功能如下:

def list_page(request, post_city):

    p_c = City.objects.filter(city_name__iexact=post_city).get()
    p_p = p_c.province_name
    p_country = p_p.country_id

    pp=City.objects.all()

    print(pp)

    context = {
    'post_city' : post_city,

    'all_p_cities': all_p_cities,

    }
    return render(request, 'path/to/list_page.html', context )

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以通过在查找参数名称中使用多个__ 部分来链接多个相关的模型查找。

    cities_in_narnia = City.objects.filter(province_name__country_id__country_name='Narnia')
    

    在 Django 文档中了解更多信息:Lookups that span relationships

    作为旁注。您可以使用一些命名约定来使您的代码更具可读性,尤其是在向在线社区寻求帮助时。

    class City(models.Model):
        # foreign key fields should be the snake_case or lower case name of the related model class
        province = models.ForeignKey(Province, on_delete=models.CASCADE)
    
        # there's no need to prefix field or attribute names with the class name 
        # City.city_name is superfluous. City.name is perfectly clear.  
        name = models.CharField(max_length=64)
    
        # methods and attributes should also be snake_case, only use CapitalCase for class names.
        @property
        def country_name(self):
            return self.province.country.name
    

    如果您遵循这些命名约定,过滤器查找也将是可读且简洁的。

    cities_in_narnia = City.objects.filter(province__country__name='Narnia')
    

    【讨论】:

    • 感谢您的回复。这给了我空的查询集。这不是我想要的。我添加了示例以阐明我想要做什么。示例:通过 URL:我将 post_city 变量设置为 Los Angeles。因此,无论加利福尼亚州如何,我都想要美国的所有城市。另一个例子,如果 post_city 变量是 London,那么,我想要英国的所有城市,不考虑省份。
    • 如果您得到一个空的查询集,那么国家名称或城市名称的拼写可能与您输入的不同。或者您的数据库中没有纳尼亚这个国家?一个空的查询集表明查询是有效的。如果它无效,django 会引发异常。
    • 除此之外,您应该为您的关系查看更好的命名约定。不过,我想强调的一点是,由于您正在像这样的 URL 中搜索位置 `/someurl/New York`,因此您绝对应该考虑为位置名称添加一个 slug 字段,并确保您搜索的是那个. New York slug -> new-york 使您的 URL 看起来像这样 some-url/new-york
    • 我会按照你的建议去做。非常感谢
    猜你喜欢
    • 2017-08-10
    • 2015-07-13
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2012-12-15
    • 2018-09-13
    • 2010-09-26
    相关资源
    最近更新 更多