id'的缓存列表;django queryset的,并将该列表重新用于另一个视图集

id'的缓存列表;django queryset的,并将该列表重新用于另一个视图集,django,postgresql,django-rest-framework,django-views,django-queryset,Django,Postgresql,Django Rest Framework,Django Views,Django Queryset,让我们以这4个简单的模型为例。一个城市可以有多个商店,一个商店可以有多个产品,一个产品可以有多个图像 型号.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='relat

让我们以这4个简单的模型为例。一个城市可以有多个商店,一个商店可以有多个产品,一个产品可以有多个图像

型号.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)
    description=models.CharField(max_length=5000)
    shop=models.ForeignKey(Shop, related_name='related_shop', on_delete=models.CASCADE)

class Image(models.Model):
    image=models.ImageField(null=True)
    product=models.ForeignKey(Product, related_name='related_product', on_delete=models.CASCADE)
对于一个电子商务网站,用户将写关键字,我过滤产品名称,以获得匹配结果。我还想收集与我将展示的产品相关的商店、城市和图像的相关数据。 为了实现这一点,我正在使用。选择_related()从foreignKeys中检索其他对象

现在,我的问题是,什么是最好的方式发送给客户

一种方法是创建一个序列化程序,将来自所有4个表的所有数据分组到一个JSON中。JSON看起来像1NF,因为它有很多重复,例如,每个图像都有新行,每个可以找到产品的商店,每行都会重复10.000个字符的描述,所以这不是一个好主意。更具体地说,这些字段是:(product\u id、product\u name、product\u description、product\u image\u filepath、product\u in\u shop\u id、shop\u in\u city\u id)

第二种方法将使用Django queryset缓存,我根本没有这方面的经验,也许您可以给我一些如何使其高效的建议

第二种方法是获取Product.objects.filter(通过输入关键字)。选择_related().all(),缓存此产品id列表,然后返回此viewset查询集。 然后,从客户端,我发出另一个GET请求,仅针对图像,我不知道如何重用我之前在上一个viewset/queryset中查询的产品id列表

如何仅获取与用户输入关键字匹配的产品所需的图像,从而无需再次查询产品的id? 在一个视图集中缓存此代码,然后在另一个视图集中再次重用它,代码会是什么样子

然后我还需要一个GET请求来获取商店和城市的列表,在那里可以获得产品,因此如果我可以重用从第一个queryset获得的id列表来获取产品,那将是非常棒的

第二种方法是好主意吗?如果是,具体如何实施

或者我应该坚持第一种方法,我怀疑这是正确的方法

我使用的是PostgreSQL数据库,我可能会在搜索引擎中使用ElasticSearch,以快速找到匹配的关键字