Django: Как объединить два связанных набора запросов в Django 0.96? - PullRequest
2 голосов
/ 06 апреля 2009

Я хотел бы объединить объекты, связанные с одним набором запросов, с объектами, связанными с другим набором запросов. Пример кода для объяснения:

## 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 ]

1 голос
/ 06 апреля 2009

Вы можете воспользоваться тем, что функции менеджера Django "многие ко многим" add и remove принимают любое количество позиционных аргументов. В этом случае я бы попробовал:

destination_shop.cats.add(*source_shop.cats.all())
0 голосов
/ 14 апреля 2009

Я настоятельно рекомендую метод 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')

Имена методов, используемые перемены, являются вымышленными, чтобы защитить невинных.

...