FieldError: Связанное поле получило недействительный поиск: содержит
Я пытаюсь реализовать простой поиск, при котором пользователь вводит любую строку в поисковый ввод и вся таблица проверяется на наличие строки.
Моя модель
class S_Owner_Master(models.Model):
User= settings.AUTH_USER_MODEL
flat_status = (('0', "Vacant"), ('1', "Occupied"))
occupants = (('0', "Vacant"), ('1', "Owner"), ('2', "Tenant"))
society = models.ForeignKey(S_Society_Master, related_name='society', null = True, on_delete=models.CASCADE)
owner_id = models.AutoField(verbose_name = "Owner ID", primary_key=True, unique=True)
owner_name = models.CharField(verbose_name = "Owner Name", max_length=100, blank=True, null=True)
owner_email_id = models.EmailField(verbose_name = "Owner Email", max_length=100)
owner_contact_number = models.CharField(verbose_name="Phone Number", max_length=15)
owner_flat_number = models.CharField(verbose_name="Flat No.", max_length=20)
owner_flat_registration_date = models.DateField(verbose_name = "Owner Flat Regn. Date")
owner_flat_transfer_date = models.DateField(verbose_name = "Owner Flat Transfer Date")
flat_area_in_sqft = models.DecimalField(verbose_name="Flat Area", max_digits=10, decimal_places=2)
flat_occupancy_status = models.CharField(verbose_name="Occupancy Status", max_length = 50, choices=flat_status)
occupied_by = models.CharField(verbose_name="Occupied By", max_length = 50, choices=occupants)
deld_in_src_ind = models.CharField(max_length=20, choices=[("yes", "Yes"), ("no", "No")], default = "no", blank=True, null=True)
created_date = models.DateField(verbose_name = "Created Date", auto_now_add = True)
created_by = models.ForeignKey(User, related_name = "+", on_delete = models.SET_NULL, verbose_name="Created By", max_length=100, blank=True, null=True)
updated_date = models.DateField(verbose_name = "Last Updated Date", auto_now_add = True, blank=True, null=True)
updated_by = models.ForeignKey(User, related_name = "+", on_delete = models.SET_NULL, verbose_name="Updated By", max_length=100, blank=True, null=True)
views.py
def owner_simple_search(request):
search_text = request.GET.get('search_field', None)
if search_text is None or search_text=="":
context ={'owners': S_Owner_Master.objects.all()}
else:
qs = S_Owner_Master.objects.filter(
Q(owner_name__contains=search_text) |
Q(owner_email_id__contains=search_text) |
Q(owner_contact_number__contains=search_text) |
Q(owner_flat_number__contains=search_text) |
Q(flat_occupancy_status__contains=search_text) |
Q(occupied_by__contains=search_text) |
Q(deld_in_src_ind__contains=search_text) |
Q(created_by__contains=search_text) |
Q(updated_by__contains=search_text)
)
context = {
'queryset': qs,
'owners': S_Owner_Master.objects.all()
}
return render(request, "societyadmin/owners_list.html", context)
owners_list.html
<form method="GET" action="">
<input class="form-control py-2 border-right-0 border" type="search" name="search_field" placeholder="Type anything to search for an owner..." />
<div class="row">
<ul>
{% for owner in queryset %}
<li>
{{ owner.owner_name }}
<span>Email: {{ owner.owner_email_id }}</span>
<span>Contact No.: {{ owner.owner_contact_number }}</span>
<span>Flat No.: {{ owner.owner_flat_number }}</span>
<span>Flat Registration Date: {{ owner.owner_flat_registration_date }}</span>
<span>Flat Transfer Date: {{ owner.owner_flat_transfer_date }}</span>
<span>Flat Area in sq.ft.: {{ owner.flat_area_in_sqft }}</span>
<span>Flat Occupancy Status: {{ owner.flat_occupancy_status }}</span>
<span>Flat Occupied By: {{ owner.occupied_by }}</span>
<span>Created Date: {{ owner.created_date }}</span>
<span>Created By: {{ owner.created_by }}</span>
<span>Updated Date: {{ owner.updated_date }}</span>
<span>Updated By: {{ owner.updated_by }}</span>
</li>
<hr />
{% endfor %}
</ul>
</div>
</form>
Я получаю ошибку -> django.core.exceptions.FieldError: Related Field got invalid lookup: contains. Я пробовал с Q(owner_name__icontains=search_text), но все равно получаю ошибки.
Предполагая, что ваша модель 'User' содержит поле 'name' (должно быть строкой), попробуйте:
Q(created_by__name__contains=search_text) |
Q(updated_by__name__contains=search_text)