TypeError запрещен набор «многие ко многим» - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь создать подобную модель, когда пользователь нажимает на кнопку, которую он генерирует в 1 подобную в базе данных. Это ошибка, которую я получаю при сохранении своего кода: прямое назначение передней стороне множества «многие ко многим» запрещено. Вместо этого используйте image_like.set ().

class Image(models.Model):
    imageuploader_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, null=True, blank=True)
    first_upload_image = models.FileField(upload_to ='picmate/%Y/%m/%d/',null=True, blank=True)
    image_caption = models.CharField(max_length=700)
    tag_someone = models.CharField(max_length=50,blank=True)
    date = models.DateTimeField(auto_now_add=True, null= True)

class Likes(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True, blank=True)
    image_like = models.ManyToManyField(Image, related_name="likes")
    likes = models.IntegerField(default=0)

def save_like(request,pk):
    image_like = get_object_or_404(Image,pk=pk)
    like_img, created = Likes.objects.get_or_create(
        image_like=image_like,
    )
    like_img.likes += 1
    like_img.save()
    return redirect('site:home')

1 Ответ

0 голосов
/ 13 февраля 2020

Как сказано в ошибках, вы не можете просто создать Like объект с:

Likes.objects.get_or_create(
    <s>image_like=image_like</s>,
)

, поскольку ManyToManyField действует как коллекция.

Однако он делает не кажется, в любом случае имеет смысл делать это. Вероятно, вам нужен ForeignKey здесь, который ссылается на Image:

class Like(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, blank=True)
    image = models.<b>ForeignKey(Image, related_name='likes')</b>
    likes = models.IntegerField(default=1)

Затем вы можете реализовать представление как:

def save_like(request,pk):
    image_like = get_object_or_404(Image, pk=pk)
    like_img, created = Like.objects.get_or_create(
        image_id=pk,
        user=request.user
    )
    if not created:
        like_img.likes += 1
        like_img.save()
    return redirect('site:home')

Затем вы можете подсчитать количество лайков для объекта Image путем суммирования likes связанных Like объектов.

Обратите внимание, что если пользователь может набрать Image только один раз, тогда вы можете опустить поле likes и логика c в операторе if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...