Django как разделить данные по уникальному ключу с помощью динамического URL?

Я делаю Django API.

Я собрал данные о месте и обзоре, используя программу crwaling.

Я хочу разделить данные отзывов по названию места, но, похоже, все отзывы сохраняются вместе и распространяются на все URL.

models.py

from django.db import models
import uuid

# Create your models here.
from django.utils.text import slugify

def generate_unique_slug(klass, field):
    origin_slug = slugify(field, allow_unicode=True)
    unique_slug = origin_slug
    numb = 1
    while klass.objects.filter(slug=unique_slug).exists():
        unique_slug = '%s-%d' % (origin_slug, numb)
        numb += 1
    return unique_slug

class BuildingData(models.Model):
    building_name = models.CharField(max_length=50, unique=True)
    slug = models.SlugField(max_length=50, unique=True, allow_unicode=True, default=uuid.uuid1)
    building_loc = models.CharField(max_length=50)
    building_call = models.CharField(max_length=20)
    #building_time = models.CharField(max_length=50)

    def save(self, *args, **kwargs):
        if self.slug:  # edit
            if slugify(self.building_name, allow_unicode=True) != self.slug:
                self.slug = generate_unique_slug(BuildingData, self.building_name)
            else:  # create
                self.slug = generate_unique_slug(BuildingData, self.building_name)
            super(BuildingData, self).save(*args, **kwargs)
    

class ReviewData(models.Model):
    building_name = models.CharField(max_length=50)
    review_content = models.TextField()
    star_num = models.FloatField()

urls.py

from django.contrib import admin
from django.urls import path
from crawling_data.views import ReviewListAPI
from crawling_data.views import BuildingInfoAPI

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/buildingdata/', BuildingInfoAPI.as_view()),
    path('api/buildingdata/<str:slug>/', ReviewListAPI.as_view())
]

Часть программы crwaling

if __name__=='__main__':
        for item in building_dict:
            BuildingData(building_name = item['place'], building_loc = item['location'], building_call = item['call']).save()
            #BuildingData(building_name = item['place'], building_loc = item['location'], building_call = item['call'], building_time = item['time']).save()
        for item in review_dict:
            ReviewData(building_name = item['place'], review_content = item['review'], star_num = item['rate']).save()

Приведенный выше код запускается, когда программа просмотрела все страницы.

Я думаю, что этот код сохраняет все отзывы на одной БД.

Так что я хочу вот что

api/buildingdata/A/

A building - a review
A building - b review

api/buildingdata/B/

B building - a review
B building - b review

Но мой api выглядит следующим образом

api/buildingdata/A/

A building - a review
A building - b review
B building - a review
B building - b review

api/buildingdata/B/

A building - a review
A building - b review
B building - a review
B building - b review

Что нужно изменить, чтобы разделить данные обзора по названию места?

Вы можете использовать класс view, как показано в примере ниже, см. эту ссылку stack

class BuildingInfoAPIList(generics.ListAPIView):    
serializer_class = BuildingDataSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
lookup_url_kwarg = "uid"

def get_queryset(self):
    uid = self.kwargs.get(self.lookup_url_kwarg)
    building = BuildingData.objects.filter(article=uid)
    return building
Вернуться на верх