首页 > 解决方案 > 如何在 save_model 上的 Django 管理员中发送 Firebase 通知

问题描述

通知已经在视图类中工作。但不能在 admin.py 中工作,我确实在 save_model 中的保存记录之后发送 puh 通知。但不在这里工作是我的方法

class EventAdmin(admin.ModelAdmin):
      list_display = ('event_name', 'event_type', 'event_city', 'event_organizer', 'start_date',
                'start_time', 'end_date', 'end_time', 'is_approved', 'is_active', 'created_at')
      fields = ('main_image', 'event_name', 'event_organizer', 'event_type', 'event_city', 'event_tag', 'event_address', 'event_description',
          'event_notes', 'start_date', 'start_time', 'end_date', 'end_time', 'age_max', 'age_min', 'event_lat', 'event_lng', 'website', 'is_approved', 'is_active', 'created_at')

      def save_model(self, request, instance, form, change):

        user = request.user
        instance = form.save(commit=False)
        if not change or not instance.created_by:  
             instance.created_by = user

             # Here is notification class
             notifiClass = Notifications()
             notifiClass.sendNotifications(instance)

       else:
            instance.is_updated = True
            instance.modified_by = user
            instance.save()
            form.save_m2m()
    return instance

这是我Notification在 admin.py 中的课程

 class Notifications(object):
    def sendNotifications(self, data):

    users = models.NewEventNotification.objects.all().filter(is_notify=1)
    serializer = NewEventNotificationSerializer(users, many=True)
    tokens = []
    for user in serializer.data:
        tokens.append(user['user_token'])
    if tokens:

        push_service = FCMNotification(api_key=api_key)
        message_title = "New Event"
        message_body = data

        result = push_service.notify_multiple_devices(
            registration_ids=tokens, message_title=message_title, message_body=message_body)

        print(result)

这在浏览器中显示结果

TypeError at /admin/events/event/add/
Object of type Event is not JSON serializable
Request Method: POST
Request URL:    http://192.168.0.104:8000/admin/events/event/add/
Django Version: 2.1.5
Exception Type: TypeError
Exception Value:    
Object of type Event is not JSON serializable
Exception Location: C:\Python\Python37-32\lib\json\encoder.py in default, line 179
Python Executable:  C:\Python\Python37-32\python.exe
Python Version: 3.7.4
Python Path:    
['D:\\python\\emsbackend',
 'C:\\Python\\Python37-32\\python37.zip',
 'C:\\Python\\Python37-32\\DLLs',
 'C:\\Python\\Python37-32\\lib',
 'C:\\Python\\Python37-32',
 'C:\\Users\\laptop '
 'genration\\AppData\\Roaming\\Python\\Python37\\site-packages',
 'C:\\Python\\Python37-32\\lib\\site-packages',
 'C:\\Python\\Python37-32\\lib\\site-packages\\pip-19.2.3-py3.7.egg']
Server time:    Fri, 20 Dec 2019 18:32:51 +0500

在控制台中

Internal Server Error: /admin/events/event/add/
Traceback (most recent call last):
  File "C:\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Python\Python37-32\lib\site-packages\django\contrib\admin\options.py", line 604, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Python\Python37-32\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Python\Python37-32\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Python\Python37-32\lib\site-packages\django\contrib\admin\sites.py", line 223, in inner
    return view(request, *args, **kwargs)
  File "C:\Python\Python37-32\lib\site-packages\django\contrib\admin\options.py", line 1637, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "C:\Python\Python37-32\lib\site-packages\django\utils\decorators.py", line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Python\Python37-32\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Python\Python37-32\lib\site-packages\django\contrib\admin\options.py", line 1525, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\Python\Python37-32\lib\site-packages\django\contrib\admin\options.py", line 1564, in _changeform_view
    self.save_model(request, new_object, form, not add)
  File "D:\python\emsbackend\events\admin.py", line 296, in save_model
    notifiClass.sendNotifications(instance)
  File "D:\python\emsbackend\events\admin.py", line 382, in sendNotifications
    registration_id=tokens[0], message_title=message_title, message_body=message_body)
  File "C:\Python\Python37-32\lib\site-packages\pyfcm\fcm.py", line 113, in notify_single_device
    **extra_kwargs
  File "C:\Python\Python37-32\lib\site-packages\pyfcm\baseapi.py", line 299, in parse_payload
    return self.json_dumps(fcm_payload)
  File "C:\Python\Python37-32\lib\site-packages\pyfcm\baseapi.py", line 120, in json_dumps
    ensure_ascii=False
  File "C:\Python\Python37-32\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Python\Python37-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Python\Python37-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Python\Python37-32\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Event is not JSON serializable

标签: djangofirebasedjango-rest-frameworkdjango-adminfirebase-cloud-messaging

解决方案


搜索后得到了这个解决方案。在通知类

# Here is notification class
notifiClass = Notifications()
notifiClass.sendNotifications(instance)

改成这个

# make serializer class of that event
serializer = eventSerializer(instance)
notifiClass = Notifications() 
notifiClass.sendNotifications(serializer)

推荐阅读