Django: Como mesclar dois querysets relacionados em Django 0,96?

votos
2

Eu gostaria de mesclar um querysets objetos relacionados com outros querysets objetos relacionados. Um código de exemplo para explicar:

## 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()

Como posso fazer isso corretamente?

Muito Obrigado.

Publicado 06/04/2009 em 11:58
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Você pode tirar proveito do fato de que muitos-para-muitos funções de gerente do Django adde removeaceitar qualquer número de argumentos posicionais. Neste caso, eu tentaria:

destination_shop.cats.add(*source_shop.cats.all())
Respondeu 06/04/2009 em 13:24
fonte usuário

votos
0

Eu recomendo método jarrets acima. No caso de alguém queria ver a solução que eu quase usado, mas não o fez (isso não funciona pela forma como se é o que você precisa):

@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')

nomes de métodos, vars utilizados são fictício, para proteger os inocentes.

Respondeu 13/04/2009 em 21:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more