如何在django上查询多对多关系?
我正在写一个食品配方应用程序。我希望它能够区分食谱,避免特定的食物不耐症(即乳糖、鸡蛋、麸质、二氧化硫……)。我为此提出了这个模型: models.py如何在django上查询多对多关系?,django,django-models,Django,Django Models,我正在写一个食品配方应用程序。我希望它能够区分食谱,避免特定的食物不耐症(即乳糖、鸡蛋、麸质、二氧化硫……)。我为此提出了这个模型: models.py from django.db import models from unittest.util import _MAX_LENGTH class Alimento(models.Model): INTOLERANCIAS = ( ('00', 'Ninguna'), ('GL', 'Gluten'),
from django.db import models
from unittest.util import _MAX_LENGTH
class Alimento(models.Model):
INTOLERANCIAS = (
('00', 'Ninguna'),
('GL', 'Gluten'),
('CR', 'Crustáceos'),
('HU', 'Huevos'),
('FS', 'Frutos Secos'),
('AP', 'Apio'),
('MO', 'Mostaza'),
('SE', 'Sésamo'),
('PE', 'Pescado'),
('CA', 'Cacahuetes'),
('SO', 'Sulfitos'),
('SJ', 'Soja'),
('LA', 'Lácteos'),
('AL', 'Altramuz'),
('ML', 'Moluscos'),
('CA', 'Cacao'),
)
nombre = models.CharField(max_length=60)
intolerancia = models.CharField(max_length=2, choices=INTOLERANCIAS)
def __str__(self):
return self.nombre
class Receta(models.Model):
nombre = models.CharField(max_length=100)
raciones = models.IntegerField(default=1)
preparacion = models.TextField(default='')
consejos = models.TextField(blank=True)
ingredientes = models.ManyToManyField(Alimento, through='Ingrediente')
def __str__(self):
return self.nombre
class Ingrediente(models.Model):
receta = models.ForeignKey('recetas.Receta', on_delete=models.CASCADE)
alimento = models.ForeignKey('recetas.Alimento', related_name='ingredientes', on_delete=models.CASCADE)
cantidad = models.FloatField(default=0)
descripcion = models.CharField(max_length=60, blank=True)
def __str__(self):
return self.alimento.__str__()
我已经在admin.py中注册了它们,我可以创建/更新/删除它们,但是我在admin UI的任何地方都看不到manytomany字段
管理员
从django.contrib导入管理
from .models import Alimento, Receta, Ingrediente
admin.site.register(Alimento)
admin.site.register(Receta)
admin.site.register(Ingrediente)
所以我去了shell,在那里尝试了一些查询
Alimento.objects.all()
<QuerySet [<Alimento: Pan>, <Alimento: Tomate>, <Alimento: Vinagre de vino>, <Alimento: Ajo>, <Alimento: Pimiento Verde>, <Alimento: Sal>, <Alimento: Aceite de Oliva>]>
Receta.objects.all()
<QuerySet [<Receta: Gazpacho>]>
gaz = Receta.objects.get(nombre='Gazpacho')
Ingrediente.objects.filter(receta=gaz)
<QuerySet [<Ingrediente: Pan>, <Ingrediente: Tomate>, <Ingrediente: Tomate>, <Ingrediente: Pimiento Verde>, <Ingrediente: Aceite de Oliva>, <Ingrediente: Vinagre de vino>, <Ingrediente: Ajo>]>
pan = Alimento.objects.get(nombre='Pan')
pan.intolerancia
'GL'
Alimento.objects.all()
Receta.objects.all()
gaz=Receta.objects.get(nombre='Gazpacho')
Ingrediente.objects.filter(receta=gaz)
pan=Alimento.objects.get(nombre='pan')
泛不容忍
“德国劳埃德船级社”
鉴于此,我如何查询给定不耐受/过敏(Alimento:Inolerancia)的收据(Receta)?您可以访问
Alimento
模型,使用模型收据的Ingredentes
字段。在您的过滤器中,您可以使用它,并检查Alimento
Receta.objects.filter(ingredientes__intolerancia='GL')
评论中的问题后更新
您可以使用您的模型收据的
ingredientes
字段访问Alimento
模型。在您的过滤器中,您可以使用它,并检查Alimento
Receta.objects.filter(ingredientes__intolerancia='GL')
评论中的问题后更新
直接解法
class IngredienteInline(admin.TabularInline):
model = Ingrediente
extra = 1
class AlimentoAdmin(admin.ModelAdmin):
inlines = (IngredienteInline,)
class RecetaAdmin(admin.ModelAdmin):
inlines = (IngredienteInline,)
那么
参考文献
现在,对过滤器的查询是
Receta.objects.filter(ingredientes__intolerancia ='CR')
直接解法
class IngredienteInline(admin.TabularInline):
model = Ingrediente
extra = 1
class AlimentoAdmin(admin.ModelAdmin):
inlines = (IngredienteInline,)
class RecetaAdmin(admin.ModelAdmin):
inlines = (IngredienteInline,)
那么
参考文献
现在,对过滤器的查询是
Receta.objects.filter(ingredientes__intolerancia ='CR')
希望这能帮上忙希望这能帮上忙我试过了,效果不错,谢谢!有可能给它多个值吗?相当于SQL“incoleranciain('GL',SO','HU')”?非常感谢我试过了,效果很好,谢谢!有可能给它多个值吗?相当于SQL“incoleranciain('GL',SO','HU')”?非常感谢D