Django: Как объединить два связанных набора запросов в Django 0.96?
Я хотел бы объединить объекты, связанные с одним набором запросов, с объектами, связанными с другим набором запросов. Пример кода для объяснения:
## Models
# sample models to illustrate problem
class PetShop(models.Model):
id = models.AutoField(primary_key=True)
shop_name = models.CharField(maxlength=255)
cats = models.ManyToManyField(Cat)
class Cat(models.Model):
id = models.AutoField(primary_key=True)
cat_name = models.CharField(maxlength=50, blank=True)
## View
def MergePetsInShop(request):
source_shop = PetShop.objects.get(pk=2)
destination_shop = PetShop.objects.get(pk=3)
#Somehow merge CATS from one shop to the other
result = merge(source_shop.cats,destination_shop.cats)
#save()
Как я могу сделать это правильно?
Большое спасибо.
2 ответа
Решение
Вы можете воспользоваться тем, что у Django функции "многие ко многим" add
а также remove
принять любое количество позиционных аргументов. В этом случае я бы попробовал:
destination_shop.cats.add(*source_shop.cats.all())
Я настоятельно рекомендую метод Jarrets выше. В случае, если кто-то хотел увидеть решение, которое я почти использовал, но не смог (это работает, кстати, если это то, что вам нужно):
@login_required
def MergePetsBetweenShops(request):
src = int(request.__getitem__("source_shop"))
dest = int(request.__getitem__("destination_shop"))
srcShop = PetShop.objects.get(pk=src)
destShop = PetShop.objects.get(pk=dest)
srcPets = srcShop.cats.all()
amtMerged = srcPets.cats.count()
for p in srcPets:
destShop.cats.add(p)
destShop.save()
return HttpResponse("Cats that were moved: "+str(amtMerged), mimetype='application/javascript')
Имена методов, используемые перемены, являются вымышленными, чтобы защитить невинных.