как получить пользователя из множества полей в django, используя djago singals, и создать еще один объект с полученным полем «многие ко многим» - PullRequest
0 голосов
/ 01 июля 2019

Я хочу знать, есть ли способ получить обновленное поле «многие ко многим» в одной модели, используя сигналы, и опубликовать их в другой модели

class Post(models.Model):

    name=models.CharField(max_length=24)
    nc=models.ManyToManyField(settings.AUTH_USER_MODEL)
    def __str__(self):
        return self.name
        # return self.name
m2m_changed.connect(receiver=like_post,sender=Post.nc.through)

Я хочу собрать обновленную запись вПоле nc для модели поста и использования сигналов. Я хочу создать объект с помощью функции, вот сигнал, который подключается к модели поста

def like_post(sender, *args, **kwargs):
    # if kwargs['action'] in ('post_update'):
    if kwargs['action'] in ('post_add', 'post_remove','post_update'):

        print(kwargs['instance'])
        instance = kwargs['instance']
        print(instance)
        notify = Notify.objects.create(
                 recipient=instance,
                 creator=Post.objects.get(pk=50),
                  state='unread',
                   type=kwargs['action'],
                )
    else:
        print('no instance') 

в получателе и в разделе создателя. Я хочу обновить эти поля существующимпользовательский объект, создатель - это человек, который обновил поле manytomany, а получатель - это человек, который создал этот пост

notify model:
class Notify(models.Model):
    recipient = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='notify_recipient',on_delete=models.CASCADE)
    creator = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='notify_sender',on_delete=models.CASCADE)
    state = ('read', 'unread', 'unseen')
    type = models.CharField(max_length=30, blank=True)
    url = models.CharField(max_length=50, blank=True)

, когда я запускаю этот экземпляр, экземпляр просто печатает имя объекта поста и выдает эту ошибку

ValueError at /admin/posts/post/50/change/
Cannot assign "<Post: ok>": "Notify.recipient" must be a "User" instance.

1 Ответ

1 голос
/ 01 июля 2019

Вы можете видеть, что ваш класс Notify определяет receipent как элемент ForeignKey для AUTH_USER_MODEL , но вы создаете Notify в своем сигнале как:

notify = Notify.objects.create(
                 recipient=instance,
                 creator=Post.objects.get(pk=50),
                  state='unread',
                   type=kwargs['action'],
                )

Здесь экземпляр является экземпляром Post, а не User, также вы также используете post экземпляр в поле создателя .Это то, что вызывает ошибку.

Чтобы устранить эту ошибку, вам нужно передать пользовательский экземпляр в эти поля.Например, вы можете использовать что-то вроде:

notify = Notify.objects.create(
                     recipient=instance.nc, # find out how to pass the user of the post here
                     creator=Post.objects.get(pk=50), # replace by an user instance here instead of a post instance 
                      state='unread',
                       type=kwargs['action'],
                    )

EDIT: Чтобы убедиться, что экземпляр пользователя сохранен, вам необходимо переопределить метод save_model вашего ModelAdmin для пост-моделикак:

class PostAdmin(admin.ModelAdmin):
    def save_related(self, request, form, formsets, change):
    if not form.cleaned_data['nc']:
        form.cleaned_data['nc'] = [request.user]
    form.save_m2m()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...