Я работаю над проектом с использованием Django REST framework и PostgreSQL.
3 таблицы, location, crime и location_crimes. Пользователь может создать местоположение, используя почтовый индекс, и система находит все преступления, которые находятся внутри этого местоположения (используя хранимую процедуру), и сохраняет их в таблицу location_crimes.
Я протестировал триггер и процедуру непосредственно в БД и они работают как положено.
Проблема в том, когда я вызываю одну конечную точку, чтобы создать новое местоположение. После вставки я использую сигнал Django для печати данных, вставленных с использованием необработанного запроса, только для тестирования.
Я обнаружил, что триггер работает, потому что мне удалось вернуть данные из этой таблицы с ожидаемым результат (вставленные данные возвращаются из обеих таблиц). Но когда я проверяю базу данных, информации там нет, и Dashboard от pgAdmin показывает, что DELETE происходит сразу после вставки; (диаграмма БД)
Я подозреваю, что откат или фиксация не выполняются, но на панели инструментов pgAdmin проблем нет.
Спасибо за вашу помощь.
ПРОСМОТР
class LocationViewSet(viewsets.ModelViewSet):
"""Manage locations in the DB"""
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
queryset = Location.objects.all()
serializer_class = serializers.LocationSerializer
def get_queryset(self):
"""Return Locations for the current auth user only"""
crimes = self.request.query_params.get('crimes')
queryset = self.queryset
return queryset.filter(user=self.request.user)
def perform_create(self, serializer):
"""Create new location"""
serializer.save(user=self.request.user)
def find_crimes_from_location(sender, **kwargs):
# this print the expected result
res = sender.objects.raw('SELECT * FROM core_location L LEFT JOIN core_location_crimes C ON C.location_id = L.id WHERE L.id = '+ str(kwargs['instance'].id))
for row in res:
kwargs['instance'].crimes.add(row.crime_id)
print(row)
post_save.connect(find_crimes_from_location, sender=Location)
МОДЕЛЬ
class Location(models.Model):
"""Location object created by user"""
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
name = models.CharField(max_length=255)
postcode = models.CharField(max_length=10)
coords = ArrayField(models.DecimalField(
max_digits=10, decimal_places=8), size=2)
crimes = models.ManyToManyField('Crime')
region = models.ForeignKey('Region', null=True, on_delete=models.SET_NULL)
def __str__(self):
return self.name