简体   繁体   中英

Update a model after deleting a row in another model in Django

I have two models UserProfile and ChatUser . ChatUser.models.py

class ChatUser(models.Model):
    chat = models.ForeignKey(ChatRoom,on_delete=models.CASCADE)
    user = models.ForeignKey(User,on_delete=models.CASCADE)

UserProfile.models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    phone_number = models.IntegerField(default=0)
    image = models.ImageField(upload_to='profile_image',blank=True,default='prof1.jpeg')
    gender = models.CharField(max_length=10)
    joined = JSONField(null=True)

ChatRoom.models

class ChatRoom(models.Model):
    eid = models.CharField(max_length=64, unique=True)
    name = models.CharField(max_length=100)
    location = models.CharField(max_length=50)
    vehicle = models.CharField(max_length=50)
    brand = models.CharField(max_length=50)
    max_limit = models.IntegerField()

joined in UserProfile is an array consisting room ids of the chatrooms model. Now when I delete a ChatRoom row, it automatically deletes the Foreign Key referenced ChatUser object since I am using on_delete=models.CASCADE . But how to update the joined in UserProfile model. I want to remove the id of the deleted ChatRoom from UserProfile.joined

@SAI SANTOSH CHIRAG- Please explain this. You have a ChatUser model that adds user_id and chatroom_id. Now, if I need to find out the list of chatrooms a user has joined, I can simply query this model. If I want to find out the total number of users in a specific chatroom then I can still query this table. Why do I need to keep track of joined in UserProfile? And I am basing this on the premise that joined keeps track of chatroom ids that a user has joined.

At any point, if you choose to add a many-to-many field in any of the models then this is my opinion. Eg Let's assume that you add the following in the UserProfile model

chatroom = models.ManytoManyField(Chat)

Imagine as the number of chatrooms the user joins grows, the list becomes larger and larger and I find it inconvenient because I will have this tiny scroll bar with a large list. It's not wrong but I simply stay away from M2M field for this purpose especially if I expect my list to grow as my application scales.

I prefer the ChatUser approach that you used. Yes, I might have repeating rows of user_ids or repeating chatroom_ids but I don't mind. I can live with it. It's still a bit cleaner to me. And this is simply my opinion. Feel free to disagree. Lastly, I would rename the ChatUser model to ChatRoomUser...Why? Just by the name of it, I can infer it has something to do with two entities Chatroom and User.

I have used the django.db.models.signals to solve the updating part.

@receiver(post_delete,sender=ChatUser)
def update_profile(sender,instance,**kwargs):
    id = instance.chat_id
    joined = instance.user.userprofile.joined
    if id in joined:
        joined.remove(id)
    model = profiles.models.UserProfile.objects.filter(user_id=instance.user.id).update(joined=joined)

SDRJ and Willem Van OnSem , thank you for your suggestions

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM