【发布时间】:2021-03-11 01:51:42
【问题描述】:
让我们以这 3 个简单的模型为例。一个城市可以有多个店铺,一个店铺可以有多个产品
models.py
class City(models.Model):
name=models.CharField(max_length=300)
class Shop(models.Model):
name = models.CharField(max_length=300)
city = models.ForeignKey(City, related_name='related_city', on_delete=models.CASCADE)
class Product(models.Model):
name=models.CharField(max_length=300)
shop=models.ForeignKey(Shop, related_name='related_shop', on_delete=models.CASCADE)
serializers.py
class CitySerializer(serializers.ModelSerializer):
class Meta:
model = City
fields=['id','name']
class ShopSerializer(serializers.ModelSerializer):
related_shop = CitySerializer(many=True, read_only=True)
class Meta:
model = Shop
fields=['id','name','related_city']
class ProductSerializer(serializers.ModelSerializer):
related_shop = ShopSerializer(many=True, read_only=True)
class Meta:
model = Product
fields=['id','name','related_shop']
在views.py 的get_queryset() 中,我使用.select_related().all() 来获取外来对象。 ProductSerializer 会给我所有的产品,并且会获取 foreignKey 商店,我也会得到找到这个产品的商店的名称。
ShopSerializer,以类似的方式,会给我所有商店的名称,以及可以找到这家商店的所有城市。
但是我怎样才能制作一个序列化程序,它会同时从所有 3 个表中检索? 我想要的字段是: fields=['product_name','shop_name', 'city_name']
我知道,我将得到的那个列表会有重复,可以被认为是 1NF 或 2NF,与我作为数据库 3NF 的模型设计相反。但这就是我想要的查询。
我实际上正在考虑对我的数据库进行非规范化,所以我可以轻松实现这一点。
我的第二个问题是,将其非规范化为 1NF 并进行重复是否更好,以便减少这 3 个表之间“id”上的 CPU 密集型内部连接?我对此进行了很多研究,通常懒惰的答案是:尝试两种变体,基准测试,然后自己决定。
【问题讨论】:
标签: django django-models django-rest-framework django-views django-serializer