将请求发布到具有过滤器的Django Rest Api.所以消息/?room = 4 [英] Post Request to Django Rest Api that has a filter. So messages/?room=4

查看:73
本文介绍了将请求发布到具有过滤器的Django Rest Api.所以消息/?room = 4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的后端是这样构建的.每个房间"都有消息",每个消息都有一个发件人(发送者).

My Backend is built like this. Every 'Room' has 'Messages' And Every Message has a Sender (person who sends it).

我要向message/?room = 4发出发帖请求.因此,我基本上想直接向id = 4的房间添加一条消息.

I want to make a post request to messages/?room=4. So I want to basically add a message directly to the room with id=4.

//models
class UserProfile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)

class Meta:
    verbose_name_plural = 'All Users'

def __str__(self):
    return self.user.username

@receiver(post_save, sender=User)
def create_user_data(sender, update_fields, created, instance, **kwargs):
if created:
    user = instance
    profile = UserProfile.objects.create(user=user)

class Message(models.Model):
sender = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="sendermessage")
content = models.CharField(max_length=500)
date = models.DateField(default=date.today)
canview = models.ManyToManyField(UserProfile, blank=True, related_name="messagecanview")

class Meta:
    verbose_name_plural = 'Messages'

def __str__(self):
    return "{sender}".format(sender=self.sender)

class Room(models.Model):
name = models.CharField(max_length=50)
members = models.ManyToManyField(UserProfile, blank=True, related_name='room')
messages = models.ManyToManyField(Message, blank=True, related_name='room')

class Meta:
    verbose_name_plural = 'Rooms'

def __str__(self):
    return "{name}".format(name=self.name)

//序列化器,视图

class UserProfileSerializer(serializers.ModelSerializer):
  username = serializers.CharField(source='user.username')
  class Meta:
    model = UserProfile
    fields = ('id', 'username')

class MessageSerializer(serializers.ModelSerializer):
  sender_obj = UserProfileSerializer(source='sender', read_only=True)
  class Meta:
    model = Message
    fields = ('id', 'content', 'date', 'sender', 'sender_obj')

class RoomSerializer(serializers.ModelSerializer):
  messages = MessageSerializer(many=True, read_only=True)
  members = UserProfileSerializer(many=True, read_only=True)
  class Meta:
    model = Room
    fields = ('id', 'name', 'members', 'messages')

class UserProfileView(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'put', 'delete', 'patch']
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer

filter_backends = (
django_filters.rest_framework.DjangoFilterBackend,
rest_framework.filters.OrderingFilter,
)
filter_fields = ['room']

class MessageView(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'put', 'delete', 'patch']
queryset = Message.objects.all()
serializer_class = MessageSerializer

filter_backends = (
    django_filters.rest_framework.DjangoFilterBackend,
    rest_framework.filters.OrderingFilter, 
)
filter_fields = ['room']

class UserMessageView(MessageView):
def get_queryset(self):
    return Message.objects.filter(canview__user=self.request.user)

class RoomView(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'put', 'delete', 'patch']
queryset = Room.objects.all()
serializer_class = RoomSerializer

class UserRoomView(RoomView):
def get_queryset(self):
    return Room.objects.filter(members__user=self.request.user)

API所有消息:

[
{
    "id": 7,
    "content": "hej",
    "date": "2019-07-08",
    "sender": 1,
    "sender_obj": {
        "id": 1,
        "username": "william"
    }
},
{
    "id": 8,
    "content": "yoyo",
    "date": "2019-07-08",
    "sender": 2,
    "sender_obj": {
        "id": 2,
        "username": "eric"
    }
},
{
    "id": 9,
    "content": "tjo bror",
    "date": "2019-07-08",
    "sender": 3,
    "sender_obj": {
        "id": 3,
        "username": "ryan"
    }
},
{
    "id": 10,
    "content": "hej jag heter Eric och jag gar pa polhemskolan i lund och jag ar 17 ar gammal",
    "date": "2019-07-08",
    "sender": 2,
    "sender_obj": {
        "id": 2,
        "username": "eric"
    }
},
{
    "id": 11,
    "content": "vi vet hahah",
    "date": "2019-07-09",
    "sender": 1,
    "sender_obj": {
        "id": 1,
        "username": "william"
    }
},
{
    "id": 12,
    "content": "amen sluta",
    "date": "2019-07-09",
    "sender": 2,
    "sender_obj": {
        "id": 2,
        "username": "eric"
    }
},
{
    "id": 13,
    "content": "hej",
    "date": "2019-07-09",
    "sender": 1,
    "sender_obj": {
        "id": 1,
        "username": "william"
    }
},
{
    "id": 14,
    "content": "hej william",
    "date": "2019-07-09",
    "sender": 3,
    "sender_obj": {
        "id": 3,
        "username": "ryan"
    }
}
]

API消息/?room = 4

API messages/?room=4

[
{
    "id": 7,
    "content": "hej",
    "date": "2019-07-08",
    "sender": 1,
    "sender_obj": {
        "id": 1,
        "username": "william"
    }
},
{
    "id": 13,
    "content": "hej",
    "date": "2019-07-09",
    "sender": 1,
    "sender_obj": {
        "id": 1,
        "username": "william"
    }
},
{
    "id": 14,
    "content": "hej william",
    "date": "2019-07-09",
    "sender": 3,
    "sender_obj": {
        "id": 3,
        "username": "ryan"
    }
}
]

如果某人有解决方案,它将有助于加载.我需要使其工作,因为它是我在fluttermobile上开发的聊天应用程序.

If someone has a solution it would help loads. I need to get this to work because its a chat application I am developing on flutter- mobile.

推荐答案

更改您的MessageSerializer以显示room related_field(这是一个ManyToManyField,因此每条消息可以关联到多个房间...) :

Change your MessageSerializer to expose the room related_field ( which is a ManyToManyField and thus each message can be associated to multiple rooms...):

class MessageSerializer(serializers.ModelSerializer):
        [...]
        fields = ('id', 'content', 'date', 'sender', 'sender_obj', 'room')
        #                                                        ^^^^^^^^

POST到您的/message界面,例如:

{ 
  "content": "foodefafa", 
  "sender": 17,
  "rooms":[42] 
}

这篇关于将请求发布到具有过滤器的Django Rest Api.所以消息/?room = 4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆