Django 'change'找不到现有对象



Currentli我的django项目仍然使用Sqlite作为数据库。我有一个名为"监控"的模型。

class Monitoring(models.Model):
tebar=models.ForeignKey(Tebar,
on_delete=models.CASCADE,
related_name='monitoring',)
date_created = models.DateTimeField(
verbose_name=("Tanggal"),
auto_now_add=True, null=True,
editable=False,)
prevmon=models.ForeignKey('self',
on_delete=models.CASCADE,
related_name='nextmon',
editable=False,
blank=True, null=True)
dead = models.PositiveIntegerField(verbose_name='Jml. Mati', default=0,
null=True)
food = models.ForeignKey(Bahan,
on_delete=models.CASCADE,
related_name='monitoringfood',
verbose_name='Pakan',
blank=True, null=True)
foodqty=models.PositiveIntegerField(null=True, default=0,
verbose_name='Berat Pakan',)
suplemen=models.ForeignKey(Bahan,
on_delete=models.CASCADE,
related_name='monitoringsupl',
verbose_name='Suplemen',
blank=True, null=True)
suplqty=models.PositiveIntegerField(null=True, default=0,
verbose_name='juml.Supl.',)
feedcost = models.DecimalField(max_digits=10, decimal_places=2,
default=0.0,
blank=True, null=True)
ph = models.DecimalField(max_digits=5, decimal_places=2,
blank=True, null=True)
weight = models.DecimalField(max_digits=7, decimal_places=2,
verbose_name='gram/ekor', default=0.0,
null=True)
wateradd= models.PositiveIntegerField(verbose_name='Tambah Air',
null=True, blank=True,
help_text='Penambahan Tinggi Air dalam Cm')
class Meta :
verbose_name_plural='7. Perlakuan'
def __str__(self):
return '{}; {}'.format(self.tebar, self.date_created)

我加一条记录,获得成功。我试图更改记录,网页转到/admin在站点名称行下,我得到消息:

Monitoring with ID “6” doesn’t exist. Perhaps it was deleted?

我试图通过django控制台访问数据库,记录就在那里。

>>> from catatkolam.models import *
>>> Monitoring.objects.get(id=6)
<Monitoring: kolam 1@2021-05-02; 2021-05-06 07:19:53.288664+00:00>
>>> Monitoring.objects.get(id='6')
<Monitoring: kolam 1@2021-05-02; 2021-05-06 07:19:53.288664+00:00>
>>> 

当我想更改新记录时,我试图添加另一个记录,但得到了相同的消息。

我知道有一些SO关于这类问题的帖子。但他们都使用自定义pk或关于文件上传

这是来自管理员.py

class MonitoringAdmin(admin.ModelAdmin):
#list_filter = ('tebar',)
list_display = ('tebar','food','foodqty','suplemen','suplqty','_weight','dead','wateradd','ph',)
fields = ('tebar','food','foodqty','suplemen','suplqty','weight','dead','wateradd','ph',)
def _weight(self,obj):
return obj.xweight
_weight.short_description = 'gr/ekor'

def has_module_permission(self, request):
return False
def has_add_permission(self, request):
try :
if self.tebarObj.isrunning==True:
return super(MonitoringAdmin,self).has_add_permission(request)
return False
except Exception as e :
return False
'''
def has_change_permission(self, request):
try :
if self.tebarObj.isrunning==True:
return super(MonitoringAdmin,self).has_change_permission(request)
return False
except Exception as e :
return False
'''
def get_queryset(self, request):
qs = super().get_queryset(request)
try :
tebarId = dict(request.GET)['tebar__id__exact'][0]
try :
tebarObj = Tebar.objects.get(id=tebarId)
assert tebarObj.kolam.user==request.user
ret = qs.filter(tebar=tebarObj)
self.tebarObj = tebarObj
return ret
except Exception as e:
#print('LIST tebar__id__exact not owner')
return Monitoring.objects.none()
except Exception as e : # no tebar id
#print('LIST no tebar__id__exact')
return Monitoring.objects.none()
g
def formfield_for_foreignkey(self, db_field, request, **kwargs):
print('FFFK') 
if db_field.name == 'tebar':
kwargs['queryset'] = Tebar.objects.filter(kolam__user=request.user)
try :
filtertebar = dict(request.GET).get('_changelist_filters')[0]
tebarId = int(filtertebar.split('=')[1])
kwargs['queryset'] = kwargs['queryset'].filter(id=tebarId)
kwargs['initial']=kwargs['queryset'].filter(id=tebarId)
except Exception as e:
kwargs['queryset']=Tebar.objects.none()
if db_field.name in ['food','suplemen'] :
bahanObjs = BahanServ.objects.filter(user=request.user)
if db_field.name == 'food':
kwargs['queryset'] = bahanObjs.filter(isfood=True)
else :
kwargs['queryset'] = bahanObjs.filter(isfood=False)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
admin.site.register(Monitoring, MonitoringAdmin)

我是不是错过了什么?

请给我任何解决这个问题的办法(或线索(。

啊,我的愚蠢。。。。

我没有意识到在调用form.时也会调用"get_query_set">

因此,我将管理类更改为:

class MonitoringAdmin(admin.ModelAdmin):
#list_filter = ('tebar',)
list_display = ('tebar','food','foodqty','suplemen','suplqty','_weight','dead','wateradd','ph',)
fields = ('tebar','food','foodqty','suplemen','suplqty','weight','dead','wateradd','ph',)
def _weight(self,obj):
return obj.xweight
_weight.short_description = 'gr/ekor'
def has_module_permission(self, request):
return False
def has_add_permission(self, request):
try :
if self.tebarObj[0].isrunning==True:
return super(MonitoringAdmin,self).has_add_permission(request)
return False
except Exception as e :
return False
def has_change_permission(self, request, obj=None):
try :
if self.tebarObj[0].isrunning==True:
return super(MonitoringAdmin,self).has_change_permission(request)
return False
except Exception as e :
return False
def has_delete_permission(self, request, obj=None):
try :
if self.tebarObj[0].isrunning==True:
return super(MonitoringAdmin,self).has_delete_permission(request)
return False
except Exception as e :
return False
def get_queryset(self, request):
qs = super().get_queryset(request)
qs = qs.filter(tebar__kolam__user=request.user)
tebarFilter = None
try :
tebarFilter = dict(request.GET).get('_changelist_filters')[0]
tebarFilter = tebarFilter.split('=')[1]
except :
try :
tebarFilter =  dict(request.GET).get('tebar__id__exact')[0]
except :
try :
tebarFilter = request.session['tebarFilterId']
except :
tebarFilter = None
if tebarFilter is None :
return Monitoring.objects.none()
self.tebarObj = Tebar.objects.filter(id=int(tebarFilter))
print("adding request.session['tebarFilterId']")
request.session['tebarFilterId']=self.tebarObj[0].id
return qs.filter(tebar=self.tebarObj[0])

def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'tebar':
kwargs['queryset'] = self.tebarObj
if db_field.name in ['food','suplemen'] :
bahanObjs = BahanServ.objects.filter(user=request.user)
if db_field.name == 'food':
kwargs['queryset'] = bahanObjs.filter(isfood=True)
else :
kwargs['queryset'] = bahanObjs.filter(isfood=False)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
admin.site.register(Monitoring, MonitoringAdmin)

它解决了我的问题

感谢所有

-bino-

最新更新