Данные, сохраненные с помощью триггера (AFTER INSERT) в PostgreSQL, удаляются, когда я использую Django для их сохранения. - PullRequest
3 голосов
/ 07 февраля 2020

Я работаю над проектом с использованием 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
...