Django подключение многих продуктов к одному пользователю - PullRequest
0 голосов
/ 29 января 2020

Я уже немного устал от попытки связать профиль пользователя со статьями, которые он выбрал из таблиц. А именно, если user_1 выбирает product_1 и product_2, а user_2 выбирает product_1 и product_3, то оба пользователя будут назначены своим профилям product_1,2,3,1. Как я могу решить эту проблему, я уже попробовал отношения «ManyToMany, ForeignKey и OnetoOne», ища что-то вроде соединения OneToMany.

Модели:

class UserProd(models.Model):   
#prod = models.OneToOneField(Products, on_delete=models.SET_NULL, null=True)
prod = models.ForeignKey(Products, on_delete=models.SET_NULL, null=True)
date = models.TimeField(auto_now_add=True)  
diet_quantity = models.IntegerField(default=100)
unique_number = models.CharField(max_length=10)

class Diet(models.Model):   
profile_user = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True) 
date = models.TimeField(auto_now=True)
diet_prod = models.ManyToManyField(UserProd)
#diet_prod = models.OneToOneField(UserProd, on_delete=models.SET_NULL, null=True)

и функция просмотра:

@login_required
def add_prod_to_diet(request, pk):
user_profile = Profile.objects.get(user = request.user)         
unique_number = user_profile.pk
product = Products.objects.filter(pk = pk).first()
user_product, prod_created = UserProd.objects.get_or_create(prod=product, unique_number=unique_number)
if not prod_created:        
    user_product.diet_quantity += product.quantity      
    user_product.save()
else:
    user_product.diet_quantity=product.quantity
    user_product.save()
user_diet, diet_created = Diet.objects.get_or_create(profile_user=user_profile)
if unique_number == request.user.pk:
    user_diet.diet_prod.add(user_product)
    if diet_created:
        user_diet.unique_number = unique_number         
        user_diet.save()
    messages.info(request, f"Product {product} has been added to your diet plan.")
return HttpResponse(status=204)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...