这里有关于向后关系的几个问题,但我要么太愚蠢了解它们,要么认为它们不适合我的情况.
我有模特儿
class MyModel(models.Model)
stuff = models.ManyToManyField('self', related_name = 'combined+')
Run Code Online (Sandbox Code Playgroud)
我创建了表单,我将所存储的信息组合在一起.它将对象关系存储在数据库中,如下所示:
表:
id:from_stuff_id:to_stuff_id
1:original_object_id:first_related_object
2:original_object_id:second_related_object
3:first_related_object:original_object_id
4:second_related_object:original_object_id
Run Code Online (Sandbox Code Playgroud)
所以当我显示对象first_related_object并检查与之关系时
myobject.stuff.all()
Run Code Online (Sandbox Code Playgroud)
然后我得到"original_object".但我不需要它.我希望它不会显示出这样的倒退关系.
EDIT1
所以我很难解释自己.
也许这段代码可以更好地说明我想要的东西.
myobjectone = MyModel.objects.get(pk = 1)
myobjecttwo = MyModel.objects.get(pk = 2)
myobjectthree = MyModel.objects.get(pk = 3)
myobjectone.stuff.add(myobjecttwo)
myobjectone.stuff.add(myobjectthree)
myobjectone.stuff.all()
[myobjecttwo, myobjectthree] <-- this i want
myobjecttwo.stuff.all()
[myobjectone]<-- this i do not want
myobjectthree.stuff.all()
[myobjectone]<-- this i do not want
Run Code Online (Sandbox Code Playgroud)
现在唯一的问题是 - 如果我甚至应该使用stuff.all()如果我不想要它们产生的结果并且应该编写我自己的经理/方法来获得排除后向关系的对象列表.
/ EDIT1
edit2回应亨利佛罗伦萨:
好的 - 我用空基测试它看起来像对称= False确实有数据库级别差异.我认为.
我创建了对称= False的空表,然后创建添加关系没有产生向后关系.如果我创建没有symmetrical = False的空表.然后他们是.在创建表之后,设置symmetrical = False没有区别.所以我猜这些差异在于数据库级别.
/ edit2那么我应该在这做什么?
写我自己的经理什么的? …
我有两个型号,Item并且ItemGroup:
class ItemGroup(models.Model):
group_name = models.CharField(max_length=50)
# fields..
class Item(models.Model):
item_name = models.CharField(max_length=50)
item_group = models.ForeignKey(ItemGroup, on_delete=models.CASCADE)
# other fields..
Run Code Online (Sandbox Code Playgroud)
我想编写一个序列化程序,它将所有项目组及其项目列表作为嵌套数组获取.
所以我想要这个输出:
[ {group_name: "item group name", "items": [... list of items ..] }, ... ]
Run Code Online (Sandbox Code Playgroud)
正如我所见,我应该用django rest框架写这个:
class ItemGroupSerializer(serializers.ModelSerializer):
class Meta:
model = ItemGroup
fields = ('item_set', 'group_name')
Run Code Online (Sandbox Code Playgroud)
意思是,我必须为ItemGroup(不是Item)编写序列化器.为了避免很多查询,我传递了这个查询集:
ItemGroup.objects.filter(**filters).prefetch_related('item_set')
Run Code Online (Sandbox Code Playgroud)
我看到的问题是,对于大型数据集,会prefetch_related导致带有非常大的sql IN子句的额外查询,我可以避免使用Item对象上的查询:
Item.objects.filter(**filters).select_related('item_group')
Run Code Online (Sandbox Code Playgroud)
这导致JOIN更好.
是否可以查询Item而不是ItemGroup具有相同的序列化输出?
python django django-models django-related-manager django-rest-framework
几个星期后,我正在学习Python和Django.到目前为止,已经足够阅读其他用户的问题和答案.但现在我的第一个问题的时刻已经到来.
我会尽力描述我的问题.我的问题是我无法查询或获取我想要的数据.
我想得到一个类Image的第一个对象的url,它由ForeignKey关联到一个Gallery,它由ForeignKey关联到类Entry.
这里到目前为止models.py:
class BlogEntry(models.Model):
...
title = models.CharField(max_length=100)
...
class Gallery(models.Model):
entry = models.ForeignKey('BlogEntry')
class Image(models.Model):
gallery = models.ForeignKey('Gallery')
picture = models.ImageField(upload_to='img')
Run Code Online (Sandbox Code Playgroud)
风景:
def view(request):
return render_to_response('mainview.html', {
'entryquery': BlogEntry.objects.all(),
}
)
Run Code Online (Sandbox Code Playgroud)
模板:
{% for item in entryquery %}
<h1>{{ item.title }}</h1>
<img src="{{ item.WHAT TO ENTER HERE? :) }}" />
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
很明显我想要什么?有人可以帮助我,并在可能的时候写一个简短的解释?
问候巴斯蒂安
我有一个抽象基础模型和2个继承模型,我需要强制related_name采用特定格式.
class Animal(models.Model):
legs = models.IntegerField(related_name='%(class)s')
habitat = models.ForeignKey(Habitats, related_name='%(class)s')
class DogAnimal(BaseModel):
name = models.CharField(max_length=20, related_name='dog_animal')
class CatAnimal(BaseModel):
name = models.CharField(max_length=20, related_name='cat_animal')
Run Code Online (Sandbox Code Playgroud)
通常,related_name ='%(class)s'将分别导致catanimal和doganimal.
我需要像这样的强调值:dog_animal,cat_animal
以下是"为什么"我需要这样做 - 遗产.这些模型没有使用基类组织 - 因此最初指定的related_name是'dog_animal'和'cat_animal'.改变这将是很多工作.
我的models.py中有以下代码:
class Tag(models.Model):
name = models.CharField(max_length=75)
class Article(models.Model):
tags = models.ManyToManyField(Tag)
def save(self, *args, **kwargs):
for tag in self.tags:
print tag.name
super(Article, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
当我尝试从管理面板创建文章时,我收到以下错误:
ValueError: "<Article>" needs to have a value for field "id" before this many-to-many relationship can be used.
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我需要在保存文章之前访问并迭代标记.谢谢!
我有一个模型:
class Tasks(models.Model):
name = models.CharField(max_length = 50, null = True, blank = True)
assigned_to = models.ManyToManyField(User, null = True, blank = True)
Run Code Online (Sandbox Code Playgroud)
我必须执行一个查询
tasks_for_myuser = Tasks.objects.filter(assigend_to__contains = myuser)
但这会引发错误。
django.core.exceptions.FieldError: Related Field got invalid lookup: contains
请帮忙!
如果我有以下型号:
class Fubar(models.Model):
name = models.CharField()
class Related(models.Model):
fubar = models.ForeignKey(Fubar)
Run Code Online (Sandbox Code Playgroud)
如果我使用 .related_set 访问相关对象,我希望 ORM 会神奇地缓存父 Fubar 对象:
fubar = Fubar.objects.all()[0]
related = fubar.related_set.all()[0]
related.fubar
Run Code Online (Sandbox Code Playgroud)
这会产生 3 个查询,我希望它只会产生 2 个查询,因为 related.fubar 可以在此上下文中优化为我在其上调用 RelatedManager 的同一对象。
我有这样的事情:
class Video(models.Model):
user = models.ForeignKey(User, related_name='owner')
...
Run Code Online (Sandbox Code Playgroud)
并且我正在尝试通过执行以下操作来访问特定用户拥有的所有视频:
u = User.objects.get(pk=1)
u.video_set.all()
Run Code Online (Sandbox Code Playgroud)
我收到错误'用户对象没有属性video_set'
难道我做错了什么?
django django-models django-authentication django-related-manager
我有一个可能为null的OneToOneField模型:
solution_for = models.OneToOneField('QNAQuestion', related_name='solution', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
有时它有一个值需要在视图中删除.null它的语法是什么?这是一个非常简单的问题,但谷歌并没有真正帮助.
我已经尝试过:
obj.solution_for = None
obj.solution_for = False
obj.solution_for = ''
del obj.solution_for
Run Code Online (Sandbox Code Playgroud)
但我想我必须放弃..这样做的正确方法是什么?
django django-models django-queryset django-related-manager django-1.7
我想显示一个位置的最新评分.我有2张桌子(django型号)
Class Location(models.Model):
locationname = models.CharField()
...
Class Rating(models.Model):
von_location = models.ForeignKey(Location,related_name="locations_rate")
rating = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
现在在我的数据库中,一个位置(id = 1)有3个等级(1,2,4).
我想显示一个位置的最新评级记录.我能以某种方式使用相关管理器在模板中执行此操作吗
我的愿景是:
all_locs = Location.objects.all()
Run Code Online (Sandbox Code Playgroud)
然后在模板中:
{% for location in all_locs %}
{{ location.locations_rate.latest }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
相关经理可以做这种事吗?
我正在尝试将上传的图像显示到我想象中的蔬菜目录的模板中.
我有一个页面添加一个新的蔬菜和上传图像.主模板是一个蔬菜列表,稍后会有缩略图.
现在,当查看蔬菜的详细页面时,我想显示其图像,但模板只显示字符串'VegetableImage Object'代替图像,即使使用img标签.
我很困惑,因为模板显然已经找到了图像,但它们只是作为通用字符串显示.
models.py
class Vegetable(models.Model):
title = models.CharField(max_length=0)
category = models.CharField(max_length=50,
choices=CATEGORY_CHOICES)
thumbnail = models.ImageField(upload_to = 'uploaded_images/')
class VegetableImage(models.Model):
vegetable = models.ForeignKey(Vegetable, default=None, related_name='images')
image = models.ImageField(upload_to='images/vegetable',
verbose_name='image',)
Run Code Online (Sandbox Code Playgroud)
查看主模板(所有蔬菜的列表)和详细视图
class VegetableView(generic.ListView):
template_name = 'vegetable/vegetable.html'
context_object_name = 'vegetable_list'
def get_queryset(self):
return Vegetable.objects.all()
class DetailView(generic.DetailView):
model = Vegetable
template_name = 'vegetable/detail.html'
Run Code Online (Sandbox Code Playgroud)
显示菜细节的细节模板
{% if view %}
<h1>Title: {{ vegetable.title }}</h1>
<h2>Category: {{ vegetable.category }}</h2>
<p>Thumbnail: {{ vegetable.thumbnail }}</p>
<p>Images:
{% for vegetable in vegetable.images.all %}
{{ vegetable …Run Code Online (Sandbox Code Playgroud) 尝试显示用户的所有Announce对象时出现问题.我的问题是:考虑我以id = 1的用户身份登录.当我去/ users/1 /它显示我的所有帖子.但问题是当我想通过转到/ users/2 /来显示id = 2的其他用户的所有帖子时,它仍然显示我的所有Announce对象,而不是id = 2的用户.
models.py
class Announce(models.Model):
owner = models.ForeignKey('auth.User', related_name='announces')
created_date = models.DateTimeField(auto_now_add=True)
body = models.TextField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
views.py
class UserAnnouncesList(ListView):
model = Announce
template_name = 'myApp/user_announces_list.html'
context_object_name = 'all_announces_by_user'
def get_queryset(self):
return Announce.objects.filter(owner=self.request.user)
Run Code Online (Sandbox Code Playgroud)
urls.py
urlpatterns = [
url(r'users/(?P<pk>[0-9]+)/$', views.UserAnnouncesList.as_view(), name='user_announces_list'),]
Run Code Online (Sandbox Code Playgroud)
user_announces_list.html
{% extends "account/base.html" %}
{% block content %}
{% for announce in all_announces_by_user %}
<h1>{{announce.user.username}}</h1>
<p>{{announce.body}}</p>
{% endfor %}
{% endblock content %}
Run Code Online (Sandbox Code Playgroud)
我是否必须使用某种类似的:Announce.objects.get(pk = ???)?
我感谢您的帮助!
python django listview django-queryset django-related-manager
我有两个employee与person模型有关系但与模型person没有关系的employee模型。
喜欢:
class Person(models.Model):
name = models.CharField(max_length=100)
address = models.CharField(max_length=100)
class Employee(models.Model):
person = models.ForeignKey(Person, related_name='person_info')
code = models.CharField()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我需要code人员序列化程序中的字段数据。
我可以使用个人模型中的编写方法或在个人序列化器中使用SerializerMethodField来解决此问题
像这样:
def get_employee_code(self):
return Employee.objects.get(person=self).id
Run Code Online (Sandbox Code Playgroud)
并将其添加为亲自序列化器中的源
employee_code = serializers.CharField(source='get_employee_code')
Run Code Online (Sandbox Code Playgroud)
或将员工序列化程序添加到人员序列化程序中
class PersonSerializer(serializers.ModelSerializer):
employee = EmployeeSerializer()
class Meta:
model = Person
fields = ('name', 'address', 'employee')
Run Code Online (Sandbox Code Playgroud)
但是我试图用反向关系做到这一点,但我做不到。我已经尝试过这样,它给出了一个错误
序列化器:
class PersonSerializer(serializers.ModelSerializer):
employee_code = serializers.CharField(source='person_info.code')
class Meta:
model = Person
fields = ('name', 'address', 'employee_code')
Run Code Online (Sandbox Code Playgroud)
我该如何解决反向关系呢?
python django django-models django-related-manager django-rest-framework
django ×12
python ×7
database ×1
django-1.7 ×1
django-orm ×1
foreign-keys ×1
listview ×1
lookup ×1
many-to-many ×1
orm ×1
pillow ×1
templates ×1